Стоит ли это идиоматического программирования? Пример ES6 [закрыто]
Программирование - это принятие решений о том, как реализовать любой фрагмент кода. В зависимости от таких решений код будет более или менее читаемым, эффективным, сложным и т.д. Общее решение также заключается в том, чтобы сделать это более или менее идиоматично, то есть с использованием конкретных утверждений или вашего языка программирования или парадигмы.
В качестве доказательства концепции я разработал два фрагмента кода на языке 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
1 ответ:
Идиоматический способ выглядит довольно круто и короче, но он менее эффективен итруден для чтения .Если люди, знакомые с языком, находят его трудным для чтения, это не "идиоматика". (Возможно, вы используете одно определение этого слова – "использование многих идиом1" – - но это не то, что люди имеют в виду, когда они ссылаются на идиоматический код, хотя верно, чтоArray.from({length}, fn)
, например, является идиомой1 для заполнения массива на основе функции в 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!)- например, попробуйте изменить порядок этих измерений.
1 в том смысле, что выражение, которое осознают пользователи языка, означает что-то без самого выражения, ясно передающего это.
2 или потому что кто-то другой или какая-то другая группа людей думал, что и теперь вы застряли, работая над своим кодом, или, может быть, это было по какой-то другой причине, кроме выразительности как таковой, или вышеупомянутые люди были в той же лодке., ...
3 О, Эй, идиома