0

我想知道如果

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);
}

将执行同样快。多次从功能切换到功能没有任何惩罚吗?

4

2 回答 2

5

注意: path.join 已经返回一个规范化的路径。它们具有相同的性能......并且不要使用 jsperf 来对节点进行基准测试。

代码

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");
    }
})

结果

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)
于 2013-10-15T10:35:50.630 回答
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 只识别完全未缓存的 typeof 表达式。

于 2013-10-16T10:30:18.880 回答