Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net C+的性能+;虚拟机语言在高频金融中的应用_.net_C++_Performance_Real Time_Finance - Fatal编程技术网

.net C+的性能+;虚拟机语言在高频金融中的应用

.net C+的性能+;虚拟机语言在高频金融中的应用,.net,c++,performance,real-time,finance,.net,C++,Performance,Real Time,Finance,我认为C/C++与C#/Java的性能问题已经被很好地讨论过了,这意味着我已经阅读了足够的证据表明VM语言并不一定比“接近硅”的语言慢。主要是因为JIT编译器可以进行静态编译语言无法进行的优化 然而,最近我收到一个来自一个声称Cjava的高频交易总是被C++打败的家伙的简历,他说,他是在这种情况下。 一个快速浏览的网站确实显示了HFT申请者需要C++的知识,并且在论坛上展示了所有的练习者谈论C++。 这种情况有什么特别的原因吗?我原以为,由于现代金融业务有些复杂,最好使用具有类型安全性、托管内存

我认为C/C++与C#/Java的性能问题已经被很好地讨论过了,这意味着我已经阅读了足够的证据表明VM语言并不一定比“接近硅”的语言慢。主要是因为JIT编译器可以进行静态编译语言无法进行的优化

然而,最近我收到一个来自一个声称Cjava的高频交易总是被C++打败的家伙的简历,他说,他是在这种情况下。

一个快速浏览的网站确实显示了HFT申请者需要C++的知识,并且在论坛上展示了所有的练习者谈论C++。 这种情况有什么特别的原因吗?我原以为,由于现代金融业务有些复杂,最好使用具有类型安全性、托管内存和丰富库的VM语言。那样的话,生产率更高。另外,JIT编译器正在变得越来越好。他们可以在程序运行时进行优化,因此您可能会认为他们使用运行时信息来击败非托管程序的性能

也许这些家伙正在编写C++中的关键位,并从托管环境调用它们(P/Unjk等)?有可能吗?

最后,是否有人对这一中心问题有经验,这就是为什么在这个领域中,非托管代码无疑比托管代码更受欢迎?

据我所知,HFT人员需要尽可能快地对传入的市场数据做出反应,但这不一定是一项要求。当然,如果你反应慢,情况会更糟,但你不需要保证每个响应都有一定的速度,你只需要一个快速的平均值

编辑

是的,到目前为止有几个很好的答案,但是非常笼统。让我具体说明HFT人员将运行什么样的程序

主要标准是反应能力。当订单进入市场时,您希望成为第一个能够对其做出反应的人。如果你迟到了,其他人可能会抢先一步,但每家公司都有一个稍微不同的战略,所以如果一次迭代有点慢,你可能会没事

该程序全天运行,几乎没有用户干预。处理每一条新的市场数据的任何函数每秒都会运行数十次(甚至数百次)


这些公司通常对硬件的价格没有限制。

< P>除了性能之外,还有其他理由使用C++。有一个巨大的C和C++代码库。用其他语言重写所有这些内容是不现实的。为了让P/Invoke这样的东西正常工作,必须将目标代码设计为从其他地方调用。如果没有其他的东西,你就必须写一些包装器来展示一个完全的C API,因为你不能调用/调用C++类。 最后,p/Invoke是一个非常昂贵的操作

JIT编译器正在变得越来越好。他们可以在程序运行时进行优化


是的,他们能做到。但是你忘了,任何C++编译器都能做同样的优化。当然,编译时会更糟糕,但这种优化必须在运行时完成这一事实本身就是开销。有些情况下,托管语言可以在某些任务上打败C++,但这通常是因为它们的内存模型而不是运行时优化的结果。严格来说,你当然可以在C++中有这样的内存模型,比如:C的字符串处理,编辑,但是很少有C++程序员花时间来优化JIT的代码。
有一些性能问题是托管语言的一个不利因素,即磁盘I/O。这是一次性的成本,但取决于应用程序,它可能会非常重要。即使使用最好的优化器,当程序启动时,您仍然需要从磁盘加载30MB+的JIT编译器;但是,C++的二进制数很少接近这个大小。

一个JIT编译器在理论上可以执行很多优化,是的,但是你愿意等待多久?一个C++应用程序可能需要几个小时才能编译,因为它离线时,用户不坐在那里敲击手指等待。 JIT编译器必须在几毫秒内完成。 那么,您认为哪一个可以通过最复杂的优化而不受影响呢

垃圾收集器也是一个因素。这并不是因为它比手动内存管理本身慢(我相信它的摊余成本相当不错,肯定可以与手动内存处理相媲美),而是它的可预测性较差。它几乎可以在任何时候引入失速,这在要求响应速度非常快的系统中可能是不可接受的

当然,这些语言可以进行不同的优化。C++允许编写非常紧凑的代码,几乎没有内存开销,并且许多高级操作基本上是免费的(例如,类结构)。 另一方面,在C#中,会浪费大量内存。简单地实例化一个类会带来很大的开销,因为必须初始化基本
对象
,即使实际的类是空的

C++允许编译器积极地去除未使用的代码。在C#中,它的大部分必须在那里,这样才能通过反射找到它

另一方面,C#没有指针,这是优化编译器的噩梦。在托管语言中内存分配比C++中要便宜得多。 无论哪种方式都有好处,因此期望你能得到一个简单的“一个或另一个”答案是天真的。根据具体的源代码、编译器、操作系统和运行它的硬件,其中一个可能会更快。根据您的需要,原始性能可能不是首要目标。也许你对Response更感兴趣