我有两段在 C# 和 Java 中完全相同的代码。但是 Java 的速度是它的两倍。我想知道为什么。两者的工作原理相同,即使用大型查找表来提高性能。
为什么 Java 比 C# 快 50%?
Java代码:
int h1, h2, h3, h4, h5, h6, h7;
int u0, u1, u2, u3, u4, u5;
long time = System.nanoTime();
long sum = 0;
for (h1 = 1; h1 < 47; h1++) {
u0 = handRanksj[53 + h1];
for (h2 = h1 + 1; h2 < 48; h2++) {
u1 = handRanksj[u0 + h2];
for (h3 = h2 + 1; h3 < 49; h3++) {
u2 = handRanksj[u1 + h3];
for (h4 = h3 + 1; h4 < 50; h4++) {
u3 = handRanksj[u2 + h4];
for (h5 = h4 + 1; h5 < 51; h5++) {
u4 = handRanksj[u3 + h5];
for (h6 = h5 + 1; h6 < 52; h6++) {
u5 = handRanksj[u4 + h6];
for (h7 = h6 + 1; h7 < 53; h7++) {
sum += handRanksj[u5 + h7];
}}}}}}}
double rtime = (System.nanoTime() - time)/1e9; // time given is start time
System.out.println(sum);
它只是列举了所有可能的 7 种卡片组合。除了最后使用 Console.writeLine 之外,C# 版本是相同的。
查找表定义为:
static int handRanksj[];
它在内存中的大小约为 120 MB。
C#版本有相同的测试代码。它是用秒表而不是 nanoTime() 测量的,并使用 Console.WriteLine
而不是 System.out.println("")
但它至少需要两倍的时间。
Java 大约需要 400 毫秒。对于在 Java 中的编译,我使用 -server 标志。在 C# 中,build设置为不带调试或跟踪定义的发布。
造成速度差异的原因是什么?
最佳答案
如果您在 Visual Studio 中为 C# 调试构建或发布构建计时,您将会得到非常具有误导性的计时。在 Release 模式下编译并从命令行运行或在 Visual Studio 中运行而不调试。也就是说,不是 F5 运行,而是按 Ctrl+F5 运行而不调试。
关于C# 在使用循环访问内存时比 Java 慢一半?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5276018/