我知道这与编译器有关,但我完全陷入了下一步的困境。我正在研究一个简单的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');
}
}
}
答案 0 :(得分:3)
当使用优化-O3 -march=native
编译C代码时,它运行速度比我的机器快(比我的机器快28%)。
gcc -O3 -march=native -Wall -Wextra -o monteCarloPi monteCarloPi.c
答案 1 :(得分:2)
我的问题是我应该怎样做才能在运行时优化我的C版本以提高速度?
确保在使用-O3命令行参数进行编译期间启用了优化。
您应该重复测试足够的时间以确保结果可靠。
您应该避免使用任何日志记录/ printf,因为它是一个巨大的噪音因素。
这是我的代码,万一我错过了什么。
您看到非常相似的结果的主要原因是rand()
调用非常昂贵,并且在C和JS中都需要大约相同的时间。如果你可以在循环中避免这个调用,你会立即看到有利于C的区别。