java - 高性能应用程序中的 C/C++ 与 Java/C#

标签 java c performance

我的问题是关于 Java 与编译代码的性能,例如,高性能数值应用程序中的 C++/fortran/assembly。 我知道这是一个有争议的话题,但我正在寻找具体的答案/例子。还有社区维基。我以前也问过类似的问题,但我认为我说得很笼统,并没有得到我想要的答案。

double 矩阵-矩阵乘法,在 blas 库中通常称为 dgemm,能够实现近 100% 的峰值 CPU 性能(以每秒浮点运算数计)。
有几个因素可以实现这种性能:

  • 缓存阻塞,实现最大内存局部性

  • 循环展开以最小化控制开销

  • vector 指令,如SSE

  • 内存预取

  • 保证没有内存别名

我见过很多使用汇编、C++、Fortran、Atlas、供应商 BLAS 的基准测试(典型情况是维度为 512 及以上的矩阵)。 另一方面,我听说主要的字节编译语言/实现(例如 Java)可以快或几乎与机器编译语言一样快。但是,我还没有看到明确的基准表明确实如此。相反,(根据我自己的研究)字节编译语言似乎要慢得多。

你有 Java/C# 的良好矩阵-矩阵乘法基准吗? 即时编译器(实际实现,而非假设)是否能够生成满足我列出的要点的指令?

谢谢

关于性能: 每个 CPU 都具有峰值性能,具体取决于处理器每秒可以执行的指令数。例如,现代 2 GHz 英特尔 CPU 可以实现每秒 80 亿 double 加/乘,从而产生 8 gflops 的峰值性能。矩阵-矩阵乘法是一种能够在每秒操作数方面实现几乎全部性能的算法,主要原因是计算与内存操作的比率更高(N^3/N^2)。我对订单中的某样东西感兴趣的数字 N > 500

关于实现:更高级别的细节(例如阻塞)是在源代码级别完成的。低级优化由编译器处理,可能带有关于对齐/别名的编译器提示。字节编译实现也可以使用 block 方法编写,因此原则上体面实现的源代码细节将非常相似。

最佳答案

VC++/.NET 3.5/Mono 2.2在纯矩阵乘法场景下的对比:

Source

Mono 与 Mono.Simd 在缩小与此处手动优化的 C++ 的性能差距方面有很长的路要走,但 C++ 版本显然仍然是最快的。但是 Mono 现在是 2.6 并且可能更接近,我希望如果 .NET 获得像 Mono.Simd 这样的东西,它可能会非常有竞争力,因为 .NET 和顺序 C++ 之间没有太大区别。

关于java - 高性能应用程序中的 C/C++ 与 Java/C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2348967/

相关文章:

sql - 为什么使用子查询调用UDF可以提高查询性能?

java - 通过脚本文件或通过 Java 代码初始化 SQL 数据库是否有任何继承优势?

java - Mapbox 无法在 fragment 中工作

java - 使用 CXF 测试 Web 服务连接

c - 解析用户输入的两个值

Java高效文件写入: String concatentation versus extra call to write()

java - 如何通过 Java API 更新 Elasticsearch 2.2 脚本中的嵌套对象

c - 在不创建特定管道描述符的情况下进行管道传输

c - SDL_混音器 : Mix_FreeChunk() crashing on sample created in memory

php 计数 vs sql 计数 vs 计数字段?演出