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

标签 java objective-c c arrays

<分区>

“C 快,Java 慢”,对吧?

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

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

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

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:谢谢,问题解决了。build设置 -> 优化级别

最佳答案

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

必须设计更好的基准。

关于java - 为什么这段 Java 代码比它下面的 Objective-C 代码运行得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15272398/

相关文章:

java - 如何在 TreeTable 的第二列中显示树线

ios - 应用关闭后如何在应用购买中保留删除广告

ios - 读取和写入 plist(iPhone 编程)

c - 即使写端关闭也从管道读取

c - 如何将函数的定义传递给其他函数,以便其他函数在 C 语言中调用它?

C - 指针和引用

java - 在存在 volatile 变量的情况下可以发生重新排序吗?

java - NoClassDefFoundError : org/apache/log4j/Logger

java - ObjC – 从数组中的对象获取值(NSMutableArray)

java - 使用java连接mysql数据库出错