因此,我有2个程序执行相同的操作,一个用C编写,另一个用Java编写。它们都创建50个线程,并等待所有线程完成,然后终止。
为了了解两个程序之间的时间差,我在Linux中使用了“ time”命令来获取执行时间。
对于C程序,总执行时间为0.020秒,而Java版本花费了0.663秒来完成。
我曾尝试寻找答案,但发现的所有文章(如这 两篇文章)都说Java实际上比C快,我认为这是胡说八道,因此,如果有人可以为我澄清一下,我将不胜感激。 。
谢谢。
这就是C代码的样子。
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#define N 50
void* tproc(void *arg) {
printf("Thread %d\n", *((int *) arg));
return NULL;
}
int main(int argc, char * argv[]) {
int i;
int targ[N];
pthread_t tid[N];
for(i = 0; i < N; i++) {
targ[i] = i;
if(pthread_create(&(tid[i]), NULL, &tproc, &targ[i]) != 0) {
printf("Can't create thread %d\n", i);
return 1;
}
}
for(i = 0; i < N; i++) {
if(pthread_join(tid[i], NULL) != 0) {
printf("Can't join thread %d\n", i);
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这就是Java代码的样子。
import java.util.concurrent.*;
class MyThread extends Thread {
static final int N = 50 ;
int arg;
public MyThread(int arg) {
this.arg = arg;
}
public void run() {
System.out.println("Thread " + arg);
}
public static void main(String [] args) {
MyThread[] tid = new MyThread [N] ;
for(int i = N-1; i >= 0; i--) {
tid[i] = new MyThread(i);
tid[i].start();
}
for(int i = 0; i < N; i++) {
try { tid[i].join(); }
catch(InterruptedException e) { }
}
}
}
Run Code Online (Sandbox Code Playgroud)
添加一些性能分析/时间测量可以确定。例如,在代码中添加一个计时器,以测量main运行多长时间。并多次运行测试,因为一个进程的CPU时间因执行而异(因为操作系统在做什么,等等)。
C程序被编译为与汇编紧密相关的本机代码。这意味着该程序将被编译(相当多)为CPU已经知道如何执行的单个指令。
Java程序通常被编译为中间字节码,而不是本机代码。CPU将(很可能)不知道如何运行这些指令。运行Java程序需要启动JVM,JVM会将这些字节码指令转换为本地机器代码,然后由CPU执行。加载JVM和翻译代码的此步骤需要花费额外的时间,这超出了您的“主要”功能的运行范围。
还应考虑到Java具有垃圾收集器,该垃圾收集器尤其可以防止资源泄漏。C缺少此功能,这意味着您必须自己管理资源。Java垃圾收集器还需要花费一些时间来启动,并且在执行过程中可能会导致CPU时间开销,具体取决于程序。
这里还有其他低层次和高层次的注意事项,但这只是针对初学者的。