1

“C 快,Java 慢”,对吧?

我比较了 Video2Brain 的 Objectiv-C 3.0 教程中的时间表示例,用于a)  Eclipse/Java 和b) MacBook Pro Quadcore 上的 XCode/Objectiv-C。结果绝对让我吃惊。Java 比 Objective-C 实现快 3 倍。Java:0.718 秒,而 Objective-C:2.416 秒。

问题:我想念什么?这怎么解释?谢谢!

一)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");
 }

b) Objective-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);
}

更新

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

@jlordo:当我更改为 timesTable[row][column] = (row +1) * (column +1) * count 时,我得到相同的结果

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

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

更新2

@justin:谢谢,问题解决了。构建设置 -> 优化级别

4

2 回答 2

10

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

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

于 2013-03-07T13:33:49.423 回答
5

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

读这个:

如何在 Java 中编写正确的微基准测试?

于 2013-03-07T13:27:06.453 回答