如何让我的C程序运行得更快?

时间:2018-01-12 17:51:57

标签: javascript c node.js performance

我知道这与编译器有关,但我完全陷入了下一步的困境。我正在研究一个简单的Monte-Carlo方法pi计算器,我发现节点的速度比C快大约2倍,尽管C应该快得多。

我应该做些什么来在运行时优化我的C版本以提高速度?这是我的代码,以防我错过了什么。

monteCarloPi.c

#include <stdio.h>
#include <stdlib.h>

int main() {
    int squareLen = 500;
    int squareArea = squareLen * squareLen;
    int radius = squareLen / 2;
    int radiusSqu = radius * radius;
    int x, y;
    int nInRad = 0, nTotal = 0;
    double pi;


    while(1) {
        nTotal += 1;
        x = abs((rand() % squareLen) - radius);
        y = abs((rand() % squareLen) - radius);

        if ((x*x) + (y*y) <= radiusSqu) {
            nInRad += 1;
        }

        if(nTotal % 100000000 == 0) {
            pi = ((double) nInRad / (double) nTotal) * squareArea / radiusSqu;
            printf("%lf\n", pi);
            printf("%d million monte carlo points\n\n", (nTotal / 1000000));
        }
    }
}

monteCarloPi.js

var nIn = 0, nTotal = 0;

monteCarlo();

function monteCarlo() {

    while(true){
        nTotal++;
        var xAbs = Math.abs((Math.random() * 500) - 250);
        var yAbs = Math.abs((Math.random() * 500) - 250);
        if((xAbs*xAbs) + (yAbs*yAbs) <= 250*250) {
            nIn++;
        } 

        if(nTotal % 100000000 == 0) {
            console.log(((nIn / nTotal) * 500 * 500) / (250*250));
            console.log((nTotal / 1000000) + ' million points');
            console.log('\n');
        }
    }
}

2 个答案:

答案 0 :(得分:3)

当使用优化-O3 -march=native编译C代码时,它运行速度比我的机器快(比我的机器快28%)。

gcc -O3 -march=native -Wall -Wextra -o monteCarloPi monteCarloPi.c

答案 1 :(得分:2)

  

我的问题是我应该怎样做才能在运行时优化我的C版本以提高速度?

  1. 确保在使用-O3命令行参数进行编译期间启用了优化。

  2. 您应该重复测试足够的时间以确保结果可靠。

  3. 您应该避免使用任何日志记录/ printf,因为它是一个巨大的噪音因素。

  4.   

    这是我的代码,万一我错过了什么。

    您看到非常相似的结果的主要原因是rand()调用非常昂贵,并且在C和JS中都需要大约相同的时间。如果你可以在循环中避免这个调用,你会立即看到有利于C的区别。