从C++到Java,明显没有答案的问题是为什么Java不包含运算符重载?
是不是Complex a, b, c; a = b + c;比简单得多Complex a, b, c; a = b.add(c);?
是否存在已知的原因,有效的论据,不使运算符重载?这个理由是武断的,还是输给了时间?
我一直想知道这个问题一段时间了.
当然,C#中有些东西没有针对速度进行优化,因此使用这些对象或语言调整(如LinQ)可能会导致代码变慢.
但是如果你不使用任何这些调整,只需比较C#和C++中相同的代码片段(很容易将它们翻译成另一个).真的会慢得多吗?
我已经看到比较表明在某些情况下C#可能更快,因为理论上JIT编译器应该实时优化代码并获得更好的结果:
我们应该记住,JIT编译器实时编译代码,但这是一次性开销,相同的代码(一旦到达并编译)不需要在运行时再次编译.
除非你创建和销毁数以千计的对象(比如使用String而不是StringBuilder),否则GC不会增加很多开销.用C++做这件事也会很昂贵.
我想提出的另一点是.Net中引入的DLL之间的更好的通信..Net平台的通信比基于托管COM的DLL要好得多.
我没有看到为什么语言应该更慢的任何固有原因,我并不认为C#比C++慢(从经验和缺乏一个好的解释)...
那么,用C#编写的相同代码片段会比C++中的相同代码慢吗?
如果是的话那么为什么?
其他一些参考文献(关于这一点,但没有解释为什么):
我想知道vector's push_back和insert函数之间的区别.
是否存在结构差异?
是否存在非常大的性能差异?
我使用Java编程比使用C++或C变得越来越自在.我希望能够了解使用JVM解释器所产生的性能损失,而不是本机执行相同的"项目".我意识到这里有一定程度的主观性; 该计划的质量将在很大程度上取决于良好的实施.我对一般意义上的以下几个方面感兴趣:
使用解释器时必须有一些开销基线.是否有一些一般的经验法则要记住?10%15%?(我凭空掏出这些数字)我偶尔读过一篇博客,说Java代码几乎和本机代码一样快,但我认为这可能有偏见.
JVM垃圾收集器是否会为运行时性能增加大量开销?我知道Cocoa应用程序已经开始使用垃圾收集模型,我同意它使编程变得更简单,但代价是什么?
从Java进行系统调用的开销是多少?例如,创建Socket对象而不是C套接字API.
最后,我回想一下JVM实现是单线程的.如果这是真的(我对此持怀疑态度),这是否意味着Java线程真的不是真正的线程?通常,java线程是否对应于底层内核提供的线程?Java应用程序是否与本机应用程序来自多个核心/多个CPU的方式相同?
任何了解JVM和Java程序性能错综复杂的开发人员的建议都将非常感激.谢谢.
我正在研究开发一种应用程序,它将以每秒约2000行(帧)的速度处理来自线扫描相机的数据.对于这个实时应用程序,我觉得C/C++是要走的路.(这是我的感觉,其他人会同意托管代码不适合这项任务.)
不过,我已经做了非常少的MFC或任何其他的C++图形用户界面.不过,我真的很想做C#GUI.
所以我很自然地用C/C++编写数据密集型代码,用C#编写GUI.GUI将用于设置/校准/在线监控(并可能通过UDP输出数据,因为它在C#中更容易.
首先,我想看看是否有人同意这将是要走的路.根据我的编程经验(擅长低级C算法和高级C#GUI设计),感觉恰到好处.
其次,我不确定正确的方法.我只是在VS2005中汇总了一个解决方案,它从C#应用程序中调用了一些(extern"C")DLL函数.为了确保我能做到这一点,我写了DLL中的一些全局变量,并从中读取:
test.h
int globaldata;
extern "C" __declspec(dllexport) void set(int);
extern "C" __declspec(dllexport) int get();
Run Code Online (Sandbox Code Playgroud)
TEST.CPP
extern int data=0;
__declspec(dllexport) void set(int num) {
data = num;
}
__declspec(dllexport) int get() {
return data;
}
Run Code Online (Sandbox Code Playgroud)
test.cs中
[DllImport("test")]
private static extern void set(int num);
[DllImport("test")]
private static extern int get();
Run Code Online (Sandbox Code Playgroud)
调用get()并set()正常工作(get()返回我传递给的数字set()).
现在,我知道您也可以导出C++类,但它是否必须进行管理?这是如何运作的?我是以正确的方式来做这件事的吗?
感谢你的帮助!
*** EDIT ***
首先,感谢您迄今为止的精彩答案!我总是对Stack Overflow印象深刻......
我想我应该更多地关注一件事,不一定是原始速度(这可以是原型和基准测试).让我更关心的一件事是垃圾收集器的非确定性行为.这个应用程序将不会在执行垃圾收集宽容500ms的延迟.
我只是编写代码并在纯C#中尝试这个,但如果我提前知道GC和任何其他非确定性的.NET行为(?)会导致问题,我认为我的时间会更好地用于编码C/C++并找出最好的C#接口.
为了确定开始将现有的iOS应用程序(用C语言编写)移植到Android是否合理,我必须估计如果用Java实现它的速度有多快.一些问题是Java代码必须翻译多次(到字节码,然后到使用JIT的本地代码).它可能会对实时属性(响应性)产生负面影响,对吧?
生成代码的质量如何?它在某种程度上与gcc/llvm生成的代码相当吗?如果是,您是否参考了比较结果(纸张)?
我正在编写一个具有网络组件的高性能/低垃圾应用程序(微秒级).我遇到的一个痛点是内置的Selector Selector for Java NIO的实现.
一些有问题的事情:
select因此锁定实际上是无用的.扩展或更改选择器实现是不可能的.大多数类都是最终的,私有和包私有成员位于sun.nio.ch.*包中.原生方法也使事情变得复杂.
是否还有其他更现代的选择器实现可能更高效?
我检查过的网络库只是使用了内置的Java选择器.任何帮助,将不胜感激.
在这个关于C++和Java之间性能差异的问题的高度评价的答案中,我了解到JIT编译器有时能够更好地进行优化,因为它可以确定机器的确切细节(处理器,缓存大小等):
通常,C#和Java可以同样快或者更快,因为JIT编译器 - 在第一次执行时编译IL的编译器 - 可以优化C++编译的程序,因为它可以查询机器.它可以确定机器是Intel还是AMD; Pentium 4,Core Solo或Core Duo; 或者如果支持SSE4等
C++程序必须事先通过混合优化进行编译,以便它在所有机器上运行得相当好,但是没有像单个配置(即处理器,指令集,其他硬件)那样进行优化.
问题:有没有办法告诉编译器专门针对我当前的机器进行优化?有没有能够做到这一点的编译器?
我知道默认答案是"它取决于",但我想知道你正在开发一个好应用程序的功能列表.
我对在设计时需要关注的功能特别感兴趣,因为延迟添加它们会花费我们很多.
请列出每个答案的一个功能,以便我们投票选出最重要的功能.
任何额外的信息,如你自己的战争故事,将不胜感激.
我问这个问题是从第0天开始增强我的应用程序,我认为我不是唯一一个有这个目标的人,所以请写出你认为应该存在于一个好的应用程序中的任何功能.
c++ ×6
java ×5
c ×2
c# ×2
performance ×2
android ×1
dll ×1
export ×1
ios ×1
jvm ×1
nio ×1
objective-c ×1
optimization ×1