Closed. This question is opinion-based。它当前不接受答案。
想要改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
3年前关闭。
Improve this question
编程是关于如何实现任何代码的决策。根据这样的决策,代码将或多或少地具有可读性,效率,复杂性等。常见的决策也将或多或少地习惯于此,即使用特定的语句或您的编程语言或范例。
作为概念验证,我已经用Javascript开发了两个代码段来分析性能。目标是生成形式为
第一种实现更惯用,而第二种则更传统。接下来是每个代码段:
惯用语:
传统
为了衡量性能,我使用了Performance Timing API
结果有点令人惊讶,至少对我而言。请注意,传统方式比另一种方式高效得多。
我已经重复了几次实验,结果相似
惯用的方式看起来很酷且更短,但是效率较低且难以阅读。
你怎么看待这件事?使用惯用编程代替传统编程值得吗?是否有一个一般性的答案,或者是否与每种情况密切相关?
代码的可读性和复杂性如何?
编辑:
编辑:仅供引用,我已将完整代码上载到Github:https://github.com/aecostas/benchmark-js-looping
并利用实践中将存在的实用工具类型:
不过,到目前为止,您只能使用玩具示例。
至于性能:并非所有事情都必须进行微优化。这里的两个示例具有相同的渐进时间和空间复杂度,对于许多情况来说就足够了。毕竟,您之所以使用JavaScript是因为它的语言功能使您可以更好地表达自己²,而这是以性能为代价的。而当涉及到优化时,您可能需要编写更准确的基准测试(在Node中这很难!),例如尝试重新排列这些测量值。
¹在某种意义上说是一种语言使用者已经意识到的表达,这意味着某种表达本身并不能清楚地传达这种表达。
²或因为其他人或其他人以为现在您被困在编写他们的代码上,或者可能是出于某种原因,除了表达性本身之外,或者上述人员在同一条船上³,…
³哦,成语
想要改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
3年前关闭。
Improve this question
编程是关于如何实现任何代码的决策。根据这样的决策,代码将或多或少地具有可读性,效率,复杂性等。常见的决策也将或多或少地习惯于此,即使用特定的语句或您的编程语言或范例。
作为概念验证,我已经用Javascript开发了两个代码段来分析性能。目标是生成形式为
tagA|tagB|tagC
的字符串,其中tagX
的数目是随机的,后缀A
,B
和C
是随机整数。而且,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