Closed. This question is opinion-based。它当前不接受答案。












想要改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。

3年前关闭。



Improve this question




编程是关于如何实现任何代码的决策。根据这样的决策,代码将或多或少地具有可读性,效率,复杂性等。常见的决策也将或多或少地习惯于此,即使用特定的语句或您的编程语言或范例。

作为概念验证,我已经用Javascript开发了两个代码段来分析性能。目标是生成形式为tagA|tagB|tagC的字符串,其中tagX的数目是随机的,后缀ABC是随机整数。而且,tagX不能重复。

第一种实现更惯用,而第二种则更传统。接下来是每个代码段:

惯用语:
performance.mark('A');

let tags = new Set(Array.from({length: tagCount}, () => Math.floor(Math.random() * 10)));
tags = Array.from(tags).map(x => `tag${x}`).join('|');

performance.mark('B');

传统
performance.mark('C');

let tagset = new Set();
let tagstr = "";

for (let tag=0; tag<tagCount; tag++) {
    tagset.add(Math.floor(Math.random() * 10));
}

tagset.forEach((tag) => {
    tagstr += 'tag' + tag + '|'
});

tagstr = tagstr.slice(0, -1);

performance.mark('D');

为了衡量性能,我使用了Performance Timing API

结果有点令人惊讶,至少对我而言。请注意,传统方式比另一种方式高效得多。
Idiomatic: 0.436535
Traditional: 0.048177

我已经重复了几次实验,结果相似

惯用的方式看起来很酷且更短,但是效率较低且难以阅读。

你怎么看待这件事?使用惯用编程代替传统编程值得吗?是否有一个一般性的答案,或者是否与每种情况密切相关?

代码的可读性和复杂性如何?

编辑:tagX不能重复。

编辑:仅供引用,我已将完整代码上载到Github:https://github.com/aecostas/benchmark-js-looping

最佳答案



如果熟悉该语言的人难以阅读,那就不是“惯用语”。 (您可能只用了一个词的定义-“使用许多成语”-但这并不是人们指的是惯用语的意思,尽管确实Array.from({length}, fn)是用于填充基于数组的成语¹)而是用JavaScript的功能编写的。而是按照用户所期望的方式编写的代码。)您可以通过命名以下内容来使其更接近:

const tagNumbers = Array.from(
    {length: tagCount},
    () => Math.floor(Math.random() * 10),
);

const uniqueTagNumbers = Array.from(new Set(tagNumbers));

const tagString =
    uniqueTagNumbers
        .map(n => 'tag' + n)
        .join('|');

并利用实践中将存在的实用工具类型:
import generate from '…';
import unique from '…';

const getRandomTag = () =>
    Math.random() * 10 | 0;

const tags =
    generate(tagCount, getRandomTag);

const tagString =
    unique(tags)
        .map(n => 'tag' + n)
        .join('|');

不过,到目前为止,您只能使用玩具示例。

至于性能:并非所有事情都必须进行微优化。这里的两个示例具有相同的渐进时间和空间复杂度,对于许多情况来说就足够了。毕竟,您之所以使用JavaScript是因为它的语言功能使您可以更好地表达自己²,而这是以性能为代价的。而当涉及到优化时,您可能需要编写更准确的基准测试(在Node中这很难!),例如尝试重新排列这些测量值。

¹在某种意义上说是一种语言使用者已经意识到的表达,这意味着某种表达本身并不能清楚地传达这种表达。
²或因为其他人或其他人以为现在您被困在编写他们的代码上,或者可能是出于某种原因,除了表达性本身之外,或者上述人员在同一条船上³,…
³哦,成语

关于javascript - 值得进行惯用的编程吗?一个ES6示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48560099/

10-09 15:03