为什么这个Java代码比下面的Objective-C代码运行得更快?

为什么这个Java代码比下面的Objective-C代码运行得更快?,java,objective-c,c,arrays,Java,Objective C,C,Arrays,“C是快的,Java是慢的”,对吗 我将Video2Brain的Objectiv-C 3.0教程中的times table示例与MacBook Pro四核上的Eclipse/Java和XCode/Objectiv-C进行了比较。结果让我大吃一惊。Java比Objective-C实现快3倍。Java:0.718s,而Objective-C:2.416s 问题:我错过了什么?这怎么解释呢?谢谢 a)Java代码: public static void main(String[] args) { i

“C是快的,Java是慢的”,对吗

我将Video2Brain的Objectiv-C 3.0教程中的times table示例与MacBook Pro四核上的Eclipse/Java和XCode/Objectiv-C进行了比较。结果让我大吃一惊。Java比Objective-C实现快3倍。Java:0.718s,而Objective-C:2.416s

问题:我错过了什么?这怎么解释呢?谢谢

a)Java代码:

public static void main(String[] args) {

int timesTable[][] = new int[10][10];
long beginTime = System.currentTimeMillis();

// 10 000 000 x
for (int count = 0; count < 10000000; count++) {
   for (int row = 0; row < 10; row++) {
      for (int col = 0; col < 10; col++) {
         timesTable[row][col] = (row +1) * (col +1);
      }
   }
 }
 long endTime = System.currentTimeMillis();
 System.out.println("Time elapsed = " + (endTime - beginTime) + "ms");
 }
publicstaticvoidmain(字符串[]args){
int timesTable[][]=新的int[10][10];
long beginTime=System.currentTimeMillis();
//10000 x
对于(整数计数=0;计数<10000000;计数++){
对于(int行=0;行<10;行++){
for(int col=0;col<10;col++){
时间表[行][列]=(行+1)*(列+1);
}
}
}
long-endTime=System.currentTimeMillis();
System.out.println(“经过的时间=”+(endTime-beginTime)+“ms”);
}
b)目标C代码

int main(int argc, char* argv[]) {
int timesTable[10][10];

CFAbsoluteTime beginTime = CFAbsoluteTimeGetCurrent();

 // 10 000 000 x
for (int count = 0; count < 10000000; count++) {
  for (int row = 0; row < 10; row++) {
    for (int col = 0; col < 10; col++) {
       timesTable[row][col] = (row +1) * (col +1);
    }
  }
}
 CFAbsoluteTime endTime = CFAbsoluteTimeGetCurrent();
 NSLog(@"Time elapsed = %f", endTime - beginTime);
}
intmain(intargc,char*argv[]){
国际时表[10][10];
CFAbsoluteTime beginTime=CFAbsoluteTimeGetCurrent();
//10000 x
对于(整数计数=0;计数<10000000;计数++){
对于(int行=0;行<10;行++){
for(int col=0;col<10;col++){
时间表[行][列]=(行+1)*(列+1);
}
}
}
CFAbsoluteTime endTime=CFAbsoluteTimeGetCurrent();
NSLog(@“已用时间=%f”,endTime-beginTime);
}
更新

@nhahtdh编译器选项:编译器:Apple LLVM编译器4.2

@jlordo:当我更改为TimeTable[行][列]=(行+1)*(列+1)*计数时,得到相同的结果

@Uchiugaka:对,我同意与Java相比,它基本上是C。我两次都做了五次测试。系统已重新启动。没有其他正在运行的应用程序

@Anoop Vaidya:是的,最新版本,我得到相同的时间,没有区别LLVM GCC 4.2或Apple LLVM编译器4.2

更新2


@贾斯汀:谢谢,问题解决了。构建设置->优化级别很可能是不准确的基准

请阅读以下内容:


很可能这是一个不准确的基准

请阅读以下内容:


您的“基准”有缺陷。C优化器(用于ObjC测试)应该意识到整个循环可以被删除。应在启用优化的情况下执行速度比较(例如,
-O3
)。在启用优化的情况下运行测试时,上述程序所用的时间为0.0秒(是的,我测试并确认了这一点)


必须设计更好的基准。

你的“基准”有缺陷。C优化器(用于ObjC测试)应该意识到整个循环可以被删除。应在启用优化的情况下执行速度比较(例如,
-O3
)。在启用优化的情况下运行测试时,上述程序所用的时间为0.0秒(是的,我测试并确认了这一点)


必须设计一个更好的基准。

只是一个猜测,但Java可能会检测到您正在做无用的工作,并尽早退出。@nhahtdh是的,HotSpot JIT编译器在这方面做得很好。另一个猜测——Java比Java好3倍?另一件我忘记提到的事情:编译Obj-C版本时使用了哪些选项?如果将内部赋值更改为
timesTable[row][column]=(row+1)*(column+1)*count,您会得到什么时间;这将改变每一步的内存内容,而不是一次迭代,然后是多次无操作。这只是猜测,但Java可能会检测到您正在做无用的工作,并尽早退出。@nhahdh是的,HotSpot JIT编译器在这方面做得很好。另一个猜测——Java比Java好3倍?另一件我忘记提到的事情:编译Obj-C版本时使用了哪些选项?如果将内部赋值更改为
timesTable[row][column]=(row+1)*(column+1)*count,您会得到什么时间;这将改变每一步的内存内容,而不是一次迭代,然后是多次不操作。这个答案简洁地总结为“你可能不想麻烦”,这个答案简洁地总结为“你可能不想麻烦”,更不用说微基准测试通常是在非常特定的算法测试之外完全浪费时间。在任何基于GUI的应用程序中衡量性能时,微基准测试都是毫无用处的。更不用说,微基准测试通常是在非常特定的算法测试之外完全浪费时间。当涉及到测量任何一种基于GUI的应用程序的性能时,微基准测试是完全无用的。