是否有人可以提供关于哪个更好的性能信息或见解? 这些调用可能会频繁执行,因此卷数也是一个考虑因素。
谢谢!
我没有关于C#转Java的度量标准。然而,我们有很多调用C++转Java的经验。即使在缓存了所有类和方法ID之后,它仍然非常慢。C++/JNI调用似乎需要大约1000个时钟周期,并且我们观察到限制为每秒约3M次调用。因此,我们已经进行了许多优化迭代,涉及将数据块一次性传输到Java中。此外,您必须检查Java异常或至少在返回时重置异常状态,这会增加另一个开销。
另一方面,从Java调用C++非常快。如果可以这样做,请使用它。还有一些高级技术涉及“continuations”,其中Java和C++倒置控制。它是这样的:
C++ -> Java: Start the continuation loop
Java: while some condition
Java -> C++: What do you want me to do
C++: please do this action for me
Java does the action
这种控制反转并不适用于许多(大多数?)应用程序,但它是另一个想法。您还可以考虑各种RPC方法,但这些方法也往往会相对较慢地达到最大值(大约1M /秒)。
我认为C#和Java的API是相同的。我曾经在一个环境中工作,其中C#和Java都必须通过interop / JNI与同一个C++库进行通信。似乎当涉及到性能时,Java版本更加一致,因为API非常善于交流并生成了许多瞬态对象。
这就是我们的调用方式:
double myDouble= theCPPWrapper.GetField("foo").AsDouble();
使用theCPPWrapper.GetField(string)
返回一个JNI Field
类,而Field.AsDouble()
方法则需要通过另一层交互来实现,这样做没有任何意义...
因此,GC中充满了短暂的Field对象,而Java似乎更能应对这种情况。
最终的解决方案是改变JNI / Interop api的方式:
double myDouble = theCPPWrapper.GetFieldAsDouble("foo"); // no transient Field. Yay!
无论你考虑什么,首先要检查你的本地API是否过于啰嗦,否则你的GC会受到影响。
祝好, Florian
有很多基准测试比较C/C++和Java。(第二个还包括C#) 注意:这些只是基准测试,应该谨慎对待。
http://www.idiom.com/~zilla/Computer/javaCbenchmark.html
http://reverseblade.blogspot.com/2009/02/c-versus-c-versus-java-performance.html
在一个环境中完成所有操作总是比通过转换层进行更快。当然,如果你开始进行远程调用,速度就会慢得多。这个想法是,如果你要进行跨语言交流,保持粒度高。
在 Mac 上调用 C# 代码的计划是什么?还是你会在 Mac 上使用 Java,而在 Windows 上使用 C#?只是好奇你愿意承担哪些支持要求。我希望从非托管 C++ 调用托管 C++ 应该相当高效,但我承认我从未这样做过。