【问题标题】:C++ vs Java for server application [closed]服务器应用程序的 C++ 与 Java [关闭]
【发布时间】:2012-08-23 20:45:20
【问题描述】:

我需要制作低延迟服务器,其中原始数据吞吐量不如处理数千个同时连接的能力重要。我不知道用什么语言。 Java 更简单,开发速度更快,界面美观,满足我的所有需求 + 对网络的良好支持(JAVA NIO 和选择器类)。但实际上我除了编程之外对java没有太多经验,所以即使我读到java之类的东西今天并不比native C/C++慢,仍然对性能有一些疑问,因为c/c++是编译成二进制代码的,但是 java .class 文件被解释,所以在翻译中必须有开销。

  • 有人可以发布他自己的经验吗?
  • 有人低延迟应用 程序?
  • 你的意思是更好地用于那种类型 申请?

编辑:应用程序将成为实时支持网络应用程序(如聊天等)的服务器

【问题讨论】:

  • maba:是的,谢谢,英语不及格。
  • 您的延迟要求是什么,因为“低延迟”可能意味着什么?您的网络对客户的延迟是多少?
  • 许多交易所使用 Java 并且没有延迟问题。纳斯达克 INET 是用 Java 编写的低延迟平台之一。
  • peter lawrey:我的意思是服务器必须以尽可能短的时间处理请求。我的英语不太好,我从hc.apache.org 复制了那个定理,因为我的意思是,java NIO 是为这样的事情完成的,并且仍然存在“阻塞 I/O 模型可能更适合数据密集型、低延迟场景,而非阻塞模型可能更适合高延迟场景,其中原始数据吞吐量不如同时处理数千个......”,所以我的意思是高延迟类似于高级别责任或类似的东西.

标签: java c++ c latency


【解决方案1】:

通常人们想要一个低延迟的应用程序,所以我不知道你所说的低延迟是什么意思。

所以即使我读到 java 之类的东西,今天也不会比原生 C/C++ 慢

它仍然稍微慢一点,只是在大多数情况下还不够重要。

例如,无论您使用哪种语言,网络 IO 都是网络 IO。例如除非在最极端的低延迟情况下,该语言不会使您的网络更快或更慢。

,因为c/c++被编译成二进制代码,但是java .class文件被解释,

Java 在运行时被编译为本机代码,因此两个系统最终都运行本机代码。

所以翻译必须有开销。

启动时有开销。但是一旦应用程序运行起来,影响就会小很多。

有人编写了高延迟应用程序吗?

如果您的网络延迟较高,您的语言就不太重要。

你的意思是更好地用于那种类型的应用程序?

我建议你使用你最熟悉的语言。

应用程序将成为实时支持网络应用程序的服务器

在这种情况下,如果您正确编码,您的网络延迟可能会远高于应用程序的延迟。


为了让您大致了解,典型的互联网连接延迟为 5 到 20 毫秒。典型用户只能以 50 毫秒的延迟做出反应。几乎可以用任何语言编写延迟为 20 - 50 毫秒的服务器。延迟为 200 - 500 微秒的服务器可以用 Java 或 C++ 编写。如果您想要少于 100 微秒,包括到客户端的延迟,您正在为您的核心引擎寻找专业硬件和一些 C++ 代码。在这种情况下,服务器和消费者可能会在同一栋建筑物中,如果不是同一个机架的话。

【讨论】:

  • 好的,谢谢,这就是我想看到的:),所以我不需要用 C++ 制作那个应用程序。但是如果在 hc.apache.org 上是“阻塞 I/O 模型可能更适合数据密集型、低延迟场景,而非阻塞模型可能更适合高延迟场景”,这意味着 java 异步 NIO不适合处理数千个连接并且请求和响应之间的延迟低?所以如果我不使用选择器,我可以使用什么?每个连接不可能有线程:/.
  • 在一台服务器上拥有数千个连接不利于低延迟。你将不得不做出妥协。 Google 提供快速搜索的部分原因是他们拥有大约 一百万 个服务器。您需要清楚地了解您的延迟要求是什么以及您的网络如何比较,否则您无法做出这些决定。使用普通 IO 可以为您节省 30 - 100 微秒,前提是您的 CPU 比活动连接数多。
  • @Krab NIO 不会阻塞,因此适用于数千个连接。它的延迟比阻塞 I/O 稍长,但差异在 0.3-3 毫秒的范围内(取决于许多因素)。
  • @AlexeiKaigorodov NIO 默认是阻塞的,非阻塞版本是最受关注的版本。 ;) 我倾向于使用阻塞 NIO,我发现它比阻塞 IO 对于少量连接更快。
【解决方案2】:

大多数 JVM 实现都使用 just in time (JIT) 编译技术,因此它们的效率几乎与提前编译的程序(在 C++ 或 Ocaml 中)一样高效。

我在下面采取 Linux 的观点。

JVM 通常会将您的.class 字节码文件的热点转换为机器码(增量式和一次)。

您可以考虑使用其他语言,例如 Ocaml(使用 Ocsigen 用于 Web 部件)或 Opa

当然,您总是可以用 C(或 C++)重写应用程序中非常关键的部分,然后从 Java(或 Ocaml,或其他语言)代码中调用它。

您可以在运行时生成机器代码,为实际的网络作业量身定制。查看asmjitGNU lightning。您可以生成 C 代码(在运行时,如Bismon - 在this 草稿报告中描述并由CHARIOT 资助 - 确实)然后将其编译为plugindlopen(3)dlsym(3) 它。另请参阅this 答案。运行时 C 代码生成器的一个更简单的示例是我的 manydl.c(适用于 Linux)。

您可以考虑使用 HTTP 服务器库,例如 libonionPOCOWt

您可以考虑使用SBCLCommon Lisp 中编写您的Web 应用程序。 https://common-lisp.net/ 提供了许多库 - 包括与网络相关的库。

您可以使用GNU guilePython 对您的服务器进行编码。您可以轻松找到加速 Web 服务的插件或扩展。

当然,观察到的延迟取决于您的硬件。在廉价的RaspberryPi 和在top500.Org 上列出的高端超级计算机上,情况就不一样了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多