我将开发实时应用程序,它将接收股票市场数据并进行一些处理,然后传播到客户端应用程序。 我决定在服务器和客户端之间划分计算,服务器将进行基本计算,然后将基本数据发送到计算最终变量的客户端。
我决定使用C#和使用C ++计算最终变量(称为:变量计算器)的组件来开发客户端应用程序(仅限GUI)。 在c ++中开发“变量计算器”的目的是为了模块化。 例如,如果我发现变量计算将在客户端需要更多时间,我可以在服务器端使用相同的模块。
此外,我将使用标准C ++开发服务器端。
注意: 服务器应处理一组消息并在不到一秒的时间内将其发送到客户端。市场开始时消息的最大数量为100,000条消息
有什么建议吗?
答案 0 :(得分:7)
您必须使用的实时约束是什么?微秒,毫秒,秒?
它确实需要是实时的,还是仅仅是高性能的?
假设它确实需要是实时的,那么语言不太可能是系统中最重要的东西,并且您很可能受到其余运行时环境的限制。例如:您使用的库,网络堆栈,网络协议,操作系统,CPU架构,内存,缓存等。
所有这一切,C可能会为您提供易用性和了解底层系统正在做什么的最佳组合。如果您非常了解C ++,那么如果使用严格的编码标准,它也是合适的。如果它具有极高的性能,或者具有极高的可预测性要求,那么您可能需要删除汇编程序代码,但这不太可能,并且编译器可能比您更好地理解CPU管道,并且它对于几千行代码而言,这将是不切实际的。
如果当然,如果你只是需要一些相对较快的,那么我不是实时性应该是你在语言选择中的主要考虑因素,而是适当的库和工具的可用性,开发团队的经验,适合于应用程序等是更重要的考虑因素。
答案 1 :(得分:6)
我不同意“实时”是一个模糊的定义。更有可能的是,人们只是不明白其含义。实时是指系统的响应时间与实际系统相同。实际上,您可以使系统比实时更快,从而导致类似于系统慢于实时的问题。
因此,我不相信您在使用“实时”应用程序时要求语言使用,就像真正快速的应用程序一样。
查看language shootout,了解哪种测试最适合您的设计空间;但是,我的直觉回答是使用C.
答案 2 :(得分:6)
在投资银行工作了近30年。我写了很多像这样的应用程序。您需要解决的基本问题可能不是实时性能,而是延迟和吞吐量。
此上下文中的延迟是关于减少网络延迟,语言选择不是很相关。
吞吐量是关于长时间持续的大处理能力,而性能是短时间内非常大的处理能力。虽然在这种情况下语言选择比延迟更重要,但它通常不像您想象的那么重要。
在这两者中,通常最好先设计尽可能低的延迟。吞吐量问题可以通过各种技巧在后期开发中解决,但摆脱现有设计中的高延迟要困难得多。
所以我会在客户端和服务器上使用C#,至少对于概念验证。没有必要引入额外的复杂性(另一种语言)来解决不太重要的问题。
编辑:我注意到你编辑了你的问题,说服务器需要在不超过1秒的时间内处理多达100K的消息。我怀疑你可以通过软件实现这一目标,但你可以使用a combination of software and hardware。
如果你确实需要这种级别的低延迟(而且我在业务中30年内从未需要它),那么语言选择并不像拥有非常高的带宽和超级优化和并行化算法。但我首先会质疑要求看看它们的真正含义 - 我敢打赌这不是他们所说的。
答案 3 :(得分:3)
如今,“实时”应用程序的定义非常模糊。您的实时约束可能是几十个月,具体取决于应用程序,您对语言,操作系统和工具的选择都将取决于这些。
在这种情况下,我不明白为什么你不应该在服务器端使用C#。也许有一些你没有提到的限制因素,但从你所说的我认为没有理由在你的问题中引入第二语言。
答案 4 :(得分:2)
现在,语言选择imo没有它在使用不需要大量处理能力的客户端/服务器应用程序时所使用的那么重要。只要您知道如何构建良好的体系结构,Java,C#,C / C ++将表现相似(显然本机语言将具有一些优势)。我会考虑易用性和每种语言可用的有用库量来做出决定。我不知道你的计算究竟需要什么或者你正在处理什么股票信息,但是看看图书馆和GUI开发工具并从那里开始......
答案 5 :(得分:2)
Scala,Erlang或Java。但我强烈建议使用Scala,因为它具有良好的语法和高可扩展性。
答案 6 :(得分:1)
我要看看Erlang!他们的架构似乎非常适合这样的应用程序。
答案 7 :(得分:0)
您可以查看Adaptive Communications Environment,这是一个用于在C ++中编写高性能服务器的便携式服务器框架。 This Stackoverflow posting有一系列链接描述它并散布到各种资源。
答案 8 :(得分:0)
Dan的直觉回答是错的,看看他发布的网站很清楚现在C ++(gnu / intel实现)如何胜过C实现
答案 9 :(得分:0)
如果您真的想要低延迟和高吞吐量,我建议您删除服务器内的任何数据处理(计算)。如果你真的想要/不需要在客户端进行计算,我会设置另一个服务器来提供派生数据的补充数据流。也就是说,您的计算值基于原始/原始Feed。
你在谈论什么样的计算?
您打算如何处理网络和网络堆栈中的吞吐量?你有延迟测量工具/嗅探器/ endace卡吗?
答案 10 :(得分:0)
我也实现了这样一个系统,我认为RoadWarrior实际上总结得很好。
这是消息队列的一个了不起的应用程序区域,如果您利用良好的底层MQ技术,我相信您几乎可以使用任何编程语言,甚至更高级别的解释语言来满足您的吞吐量要求。