3

我有一个 nodejs 程序,我在其中进行了大量计算。我正在考虑让它更快,所以我决定尝试将一些代码移动到 C++ 中。但首先我进行了快速测试,看看性能提升是否显着。

我知道在 v8 中调用 c++ 函数很昂贵,所以在我的测试中只有一个调用!

binding.gyp 文件:

{
  "targets": [
    {
      "target_name": "test",
      "sources": [ "test.cc" ]
    }
  ]
}

test.cc 文件:

#include <node.h>
#include <v8.h>
#include <cstdlib>
#include <time.h>

using namespace v8;

Handle<Value> Func(const Arguments& args) {
  HandleScope scope;
  double sum = 0;
  double x = rand() / RAND_MAX;
  double y = rand() / RAND_MAX;

  for (int i = 0; i < 1e9; i += 1) {
    x = x / y;
    y = x * rand() / RAND_MAX;
    sum += x + y;
  }

  return scope.Close(Number::New(sum));
}

void init(Handle<Object> exports) {
  srand(time(NULL));
  exports->Set(String::NewSymbol("func"),
      FunctionTemplate::New(Func)->GetFunction());
}

NODE_MODULE(test, init)

test.js 文件:

'use strict';

var cpp = require("./build/Release/test").func;

function js() {
  var sum = 0;
  var x = Math.random();
  var y = Math.random();

  for (var i = 0; i < 1e9; i += 1) {
    x = x / y;
    y = x * Math.random();
    sum += x + y;
  }

  return sum;
}

function log(msg, hrtime) {
  console.log(msg, (hrtime[0] * 1e9 + hrtime[1]) * 1e-9);
}

var t = process.hrtime();
js();
log('JS', process.hrtime(t));

t = process.hrtime();
cpp();
log('CPP', process.hrtime(t));

结果:

JS 8.060747399 
CPP 15.041201326000001

为什么 c++ 插件这么慢?

我正在使用节点 v0.10.21

4

2 回答 2

2

div 操作是最昂贵的,与 js 代码相比,您使用它的次数多了 3 次。此外,您不知道 random() 是如何实现的。c++的random()代码可能与 js 的代码有很大的不同random(),所以不要做任何假设。

于 2013-11-07T10:11:10.773 回答
2

“用 C++ 编写性能敏感部分”的想法在 V8 中是有缺陷的。这在 python/php 中是有意义的,其中规范解释器实际上比 V8 编译的 javascript 慢 10000 倍以上。

如果您在编写 JS 时考虑到性能,您将很容易达到足够快的水平。尽管编写这样的 JS 并不容易,因为几乎每个直观的习惯用法都对性能不利。

于 2013-11-07T12:14:28.733 回答