在简单的循环测试中,Javascript比Classical C快100,为什么?

时间:2014-09-02 17:26:24

标签: javascript c

对于以下简单的for循环示例,JavaScript如何比C快得多。在测试这两个代码后,它比C 100次JavaScript如何在循环中比C更快地进行字符串连接?有人说JavaScript 重型动态语言 ,它改变了变量,运行时起作用,这是什么意思? 从str {变量console.logprintf开始,证明了for循环被执行了 我猜这两个代码都没有任何编译器优化。

JavaScript循环时间: 205ms
C循环时间: 32500ms

的javascript:

 var i, a, b, c, max,str;
 max = 2e5;
 str="";
 var a = new Date();
 var myvar =   Date.UTC(a.getFullYear(),a.getMonth(),a.getDay(),a.getHours(),a.getMinutes(),a.getSeconds(),a.getMilliseconds());
 for (i=0;i< max;i++) {
     str= str+i+"=";  //just concat string
 }
 var a = new Date();
 var myvar2 = Date.UTC(a.getFullYear(),a.getMonth(),a.getDay(),a.getHours(),a.getMinutes(),a.getSeconds(),a.getMilliseconds());
 console.log("loop time:",myvar2-myvar);  //show for-loop time
 console.log("str:",str);  //for checking the for-loop is executed or not

经典c

#include <string.h>
#include <limits.h>
#include <stdio.h>
#include <time.h>
int main() {
    int i, a, b, c, max;
    clock_t t1, t2;
    t1 = clock();
    max = 2e5;
    char f[9];
    char str[10000000] = {""};
    for (i = 0; i < max; i++) {
        sprintf(f, "%ld", i); // convert integer to string
        strcat(str, "="); // just concat
        strcat(str, f);
    } // just concat
    t2 = clock();
    float diff = (((float)t2 - (float)t1) / 1000000.0F) * 1000;
    printf("loop time output in ms= :%.2fms\n", diff); // show for-loop time
    printf("str:%s\n", str); // check whether the for loop is executed or not
    return 0;
}

1 个答案:

答案 0 :(得分:3)

  

在简单的for循环测试中,Javascript比Classical C快100,为什么?

因为C没有与javascript相同的字符串。

为了使测试更公平,请进行以下更改:

在循环外添加

char *strptr;
strptr = str;

并用

替换循环
for (i = 0; i < max; i++) {
    strptr += sprintf(strptr, "=%d", i);
}

当然,现在,经过这些更改后,javascript版本可能会比C版本做更多的工作。 C没有缓冲区溢出检查。显然,javascript版本正在检查字符串的大小并在需要时扩展它。