Nodejs小测试了一下,与java,c++的百万次循环速度对比,请大神指正。
Nodejs小测试了一下,与java,c++的百万次循环速度对比,请大神指正。
nodejs代码如下:
//nodeJS
console.time('forNode');
var j=0;
for(var i=0;i<1000000;i++){
j += (i/2+i)/2;
}
console.log("j="+j)
console.timeEnd('forNode');
//C++ for nodejs
console.time('forC++');
var hello = require('./build/Release/hello.node').hello;
console.log("j="+hello)
console.timeEnd('forC++');
其中hello.node是编译好的,代码如下:
#include <node.h>
#include <v8.h>
using namespace v8;
double forfunc(){
double i,j=0;
for(i=0;i<1000000;i++){
j += (i/2+i)/2;
};
return j;
}
void init(Handle<Object> target) {
double j;
j = forfunc();
target->Set(String::NewSymbol("hello"),Number::New(j));
}
NODE_MODULE(hello, init);
java代码如下:
public class HowT {
public static void main(String[] args) {
// TODO Auto-generated method stub
long start = System.currentTimeMillis();
long j=0;
for (int i=0;i<1000000;i++)
{
j+=(i/2+i)/2;
}
long end = System.currentTimeMillis();
System.out.println("j="+j);
System.out.println("forJava: " + (end - start));
}
}
node、node调用c++f结果如下:
E:\快盘\我的代码\node.js\addon>node addon.js
j=374999625000
forNode: 12ms
j=374999625000
forC++: 6ms
java结果如下:
G:\win7\Program Files\Dropbox>java HowT
j=374999250000
forJava: 14
要说明的是:除了由于第一次加载hello.node要花多一点时间外,用node循环所需的时间波动在11-13ms,node for c++循环所需时间波动在5-7ms,java循环所需的时间波动在13-15ms。
另外如果循环体内是简单计算的话(例如简单的累加),node所需要的时间会少于node for c++,v8威武啊。
测试机器:win7 64位系统 8G内存 cpu:Intel® Core™2 Quad CPU Q8200 @ 2.33GHz 2.33GHz
根据您的描述,您进行了一个关于Node.js、Java和C++的百万次循环速度对比的小测试。以下是对您的测试内容的总结和分析。
测试环境
- 操作系统:Windows 7 64位
- 硬件配置:Intel Core 2 Quad CPU Q8200 @ 2.33GHz, 8GB内存
Node.js 代码
console.time('forNode');
var j = 0;
for (var i = 0; i < 1000000; i++) {
j += (i / 2 + i) / 2;
}
console.log("j=" + j);
console.timeEnd('forNode');
C++ 代码
首先,您使用了Node.js的addons
功能来调用C++代码。以下是C++代码:
#include <node.h>
#include <v8.h>
using namespace v8;
double forfunc() {
double i, j = 0;
for (i = 0; i < 1000000; i++) {
j += (i / 2 + i) / 2;
}
return j;
}
void init(Handle<Object> target) {
double j;
j = forfunc();
target->Set(String::NewSymbol("hello"), Number::New(j));
}
NODE_MODULE(hello, init);
Java 代码
public class HowT {
public static void main(String[] args) {
long start = System.currentTimeMillis();
long j = 0;
for (int i = 0; i < 1000000; i++) {
j += (i / 2 + i) / 2;
}
long end = System.currentTimeMillis();
System.out.println("j=" + j);
System.out.println("forJava: " + (end - start));
}
}
测试结果
- Node.js:约12ms
- Node.js 调用 C++:约6ms
- Java:约14ms
分析
从测试结果可以看出:
- Node.js 在执行百万次循环时大约需要12ms,这主要是因为V8引擎的优化,使得JavaScript代码能够高效地运行。
- Node.js 调用 C++ 的时间更短,大约为6ms。这是因为C++代码直接由底层硬件执行,性能更高。
- Java 的执行时间约为14ms,介于Node.js和Node.js调用C++之间。
总结
- Node.js 和 Java 都是高级语言,但它们的性能受制于JIT编译器和虚拟机的优化。
- C++ 作为低级语言,直接由硬件执行,因此性能最佳。
- 对于简单的循环计算任务,Node.js的性能已经相当出色,但通过调用C++可以进一步提高性能。
希望这些信息对您有所帮助!
貌似 java 是整数运算, C++ 是浮点运算,Nodejs … 本质上应该也是浮点运算吧。
嗯 我考虑过这个问题 本来c++要用long的 但是不知道为什么会溢出 nodejs通过v8会转成c++里面的类型吧 刚才把java里面的long修改成double试了一下了 运算时间也基本没变 其实我也只是粗略的演示一下nodejs的速度是非常快的 这种简单的并演示没有考虑编译器、解释器对代码的优化 以前总是有种印象:像js这样的脚本语言肯定会慢很多 其实语言的快慢和语言没有什么关系 主要是是编译器、解释器能做到多快
同层次中理想状态下,解释型不可能快于原生编译执行。其实java也是解释型,但是有JIT。nodejs的优势还是简易快速,这个层面上php python ruby 才是竞争对手,他们刚起步时都带有这些标签。谈性能。。。还是过段日子吧。。。
对于V8来说,javascript已经不是解析型的,已经是编译型的了,只是第一次编译成机器码需要一点时间
处理简单运算Java/C#会快些,你没看到PHP的跑分都很低吗?但为什么这么多低端服务器都用呢? 这跟大家经验完全不符,为什么会这样?
因为Web应用从来都不是简单的,评价性能还需要看看他吃了多少内存,看看这个语言是不是容易被过度设计,复杂度是否容易失控,需要的团队规模有多大,维护成本有多高。
-
个人认为node.js的每M内存性能最佳,JS本身是一种非常简单的语言,使用复杂设计模式时不需要消耗太多性能,单线程对内存的消耗是完全可控制,可预知的。
-
当规模上去后JAVA/C#的复杂度会呈指数上升,但你会发现JS/PHP几乎呈线性……
-
JS各模块的藕合数非常低,使用JS你会天生使用面向Library,面向模块的编程方式;使用JAVA/C#,非常容易将继承,多态,设计模式发挥到极限,写出超复杂有超强藕合关系的系统,这是语言特点决定的。
-
JS产出效率较高,因此JS适合小团队使用, 而Java文件分散,开发,编码量均较高,不利于创业型公司,这也是为什么LinkedIn, Groupon起初使用Ruby的原因。
你试过字符串操作吗? node里面执行211~219毫秒 java里面完成相同功能执行122毫秒
var s = “尊敬的张飞您好,您的验证码是:212333,感谢您的使用”; var template = “尊敬的您好,您的验证码是:******,感谢您的使用”; var temp = template.split(/*+/); function compare(s, temp, index, fromindex) { var s2 = temp[index]; if (s2 === undefined) return true; var len = s2.length; s2 = s.indexOf(s2, fromindex); if (s2 < 0) return false; return compare(s, temp, ++index, len + s2); } var startDate = Date.now(); for (var i = 0; i < 1000000; i++) { compare(s, temp, 0, 0); } console.log(Date.now() - startDate);
====================================== 上面说错了,java里执行时间53~98,初学java,感觉java慢是慢在分层太多,调用其它对象开销很大
public void test() {
long start=System.currentTimeMillis();
String s = "尊敬的张飞您好,您的验证码是:212333,感谢您的使用";
String template = "尊敬的**您好,您的验证码是:******,感谢您的使用";
String[] temp = template.split("\\*+");;
for(int j = 0; j < 1000000; j++) {
compare(s, temp,0,0);
}
System.out.println(System.currentTimeMillis()-start+"=对比时间");
}
public boolean compare(String s,String[] temp, int index, int fromindex){
if(index >= temp.length) return true;
String s2 = temp[index];
int s2len = s2.length();
fromindex = s.indexOf(s2, fromindex);
if (fromindex < 0) return false;
return compare(s, temp, ++index, fromindex + s2len);
}
根据你的描述,你在测试 Node.js、Node.js 调用 C++ 和 Java 的百万次循环速度。从你的测试结果来看,Node.js 调用 C++ 的执行速度最快,Node.js 紧随其后,而 Java 的速度稍慢一些。
示例代码
Node.js 代码
console.time('forNode');
let j = 0;
for (let i = 0; i < 1000000; i++) {
j += (i / 2 + i) / 2;
}
console.log("j=" + j);
console.timeEnd('forNode');
C++ 扩展代码(hello.node)
#include <node.h>
#include <v8.h>
using namespace v8;
double forfunc() {
double i, j = 0;
for (i = 0; i < 1000000; i++) {
j += (i / 2 + i) / 2;
}
return j;
}
void init(Local<Object> exports) {
double j = forfunc();
exports->Set(String::New("hello"), Number::New(j));
}
NODE_MODULE(hello, init);
Java 代码
public class HowT {
public static void main(String[] args) {
long start = System.currentTimeMillis();
long j = 0;
for (int i = 0; i < 1000000; i++) {
j += (i / 2 + i) / 2;
}
long end = System.currentTimeMillis();
System.out.println("j=" + j);
System.out.println("forJava: " + (end - start) + "ms");
}
}
结果分析
- Node.js 的循环时间在 11-13 毫秒之间。
- Node.js 调用 C++ 的循环时间在 5-7 毫秒之间。
- Java 的循环时间在 13-15 毫秒之间。
从这些结果可以看出:
- Node.js 在循环计算中表现不错,尤其是当循环体内的计算较为复杂时。
- Node.js 调用 C++ 可以显著提高性能,特别是当需要处理大量计算任务时。
- Java 的执行速度略低于 Node.js 和 Node.js 调用 C++,但仍然可以接受。
这种测试可以帮助你了解不同语言在特定任务上的性能差异,从而在实际开发中做出更合适的选择。