Стоит ли это идиоматического программирования? Пример 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 6

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 О, Эй, идиома