我想知道是否
function pathJoin(uri,file){
return url.format(
url.parse(
path.normalize(
path.join(uri, file)
).split(
path.delimiter
).join("/")
)
);
}
和
function pathJoin(uri,file){
var joined_path = path.join(uri, file);
var normalized = path.normalize( joined_path );
var splitted = normalized.split(path.delimiter);
var joined = splitted.join("/");
var parsed = url.parse(joined);
return url.format(parsed);
}
表现同样快。 多次从功能切换到功能是否有任何惩罚?
答案 0 :(得分:5)
注意:path.join已经返回一个规范化路径。它们具有相同的性能......并且不要使用jsperf来对节点事物进行基准测试。
<强> CODE 强>
var path = require ("path");
var url = require ("url");
var speedy = require ("speedy");
function pathJoin(uri,file){
return url.format(
url.parse(
path.normalize(
path.join(uri, file)
).split(
path.delimiter
).join("/")
)
);
}
function pathJoin2(uri,file){
var joined_path = path.join(uri, file);
var normalized = path.normalize( joined_path );
var splitted = normalized.split(path.delimiter);
var joined = splitted.join("/");
var parsed = url.parse(joined);
return url.format(parsed);
}
speedy.timeout (20000);
speedy.run ({
"1": function (){
pathJoin ("http://www.google.com", "file");
},
"2": function (){
pathJoin2 ("http://www.google.com", "file");
}
})
<强> RESULT 强>
File: t.js
Node v0.10.20
V8 v3.14.5.9
Speedy v0.0.8
Benchmarks: 2
Timeout: 20000ms (20s 0ms)
Samples: 3
Total time per benchmark: ~60000ms (1m 0s 0ms)
Total time: ~120000ms (2m 0s 0ms)
Higher is better (ops/sec)
1
50,931 ± 0.1%
2
51,029 ± 0.1%
Elapsed time: 120063ms (2m 0s 63ms)
答案 1 :(得分:4)
通常,句法差异决不会影响性能。编译器不在源代码级别运行。
在实践中,当然也有例外。在下面的例子中,V8不够智能,无法优化后者:
function a(arg) {
return typeof arg === "string";
}
function b(arg) {
var tmp = typeof arg;
return tmp === "string";
}
后者实际上会查找变量的类型字符串,然后将字符串与"string"
进行比较 - 而不是检查arg
是否是字符串,这是代码在语义上的作用。检查生成的函数代码的完全不同之处:http://pastebin.com/h7PsV39p
这也很有趣,因为人们通过“缓存typeof”进行优化,在这个过程中他们使速度慢得多,因为V8只识别完整的未缓存类型的表达式。