LINUX.ORG.RU

Пять строк с зависимостью

 ,


0

1

Читаю Airbnb JavaScript Style Guide, дохожу до пункта 3.7, где предлагается использовать (как один из хороших (или наилучших) вариантов.

Проверять наличие свойства можно так

const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
console.log(has.call(object, key));

, а можно так

import has from 'has'; // https://www.npmjs.com/package/has
console.log(has(object, key));

Во втором варианте сама проверка на 5 символов меньше, но для этого в проект надо тянуть две библиотеки, первая состоит из 5 строк:

'use strict';

var bind = require('function-bind');

module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);

, две из которых пусты. Она зависит от ещё одной библиотеки в чуть больше 50 строк.

А теперь самая суть, у этого трёхстрочника 15 миллионов загрузок в неделю.

А теперь вопрос: неужто у первого подхода есть какой-то тайный недостаток, вынуждающий тянуть какую-то левую библиотеку? Почему после left-pad такие штуки всё ещё популярны?

А теперь козырь. Я, может, что-то не понимаю, но

const has = function(object, key) {
    return Object.prototype.hasOwnProperty.call(object, key);
}
console.log(has(obj, key));

и оно вроде даже работает.

★★★

Последнее исправление: fernandos (всего исправлений: 1)
Ответ на: комментарий от no-such-file
➜ hyperfine "node func.js" "node c.js"
Benchmark 1: node func.js
  Time (mean ± σ):      1.263 s ±  0.008 s    [User: 1.258 s, System: 0.006 s]
  Range (min … max):    1.247 s …  1.280 s    10 runs
 
Benchmark 2: node c.js
  Time (mean ± σ):      1.331 s ±  0.007 s    [User: 1.324 s, System: 0.005 s]
  Range (min … max):    1.324 s …  1.344 s    10 runs
 
Summary
  'node func.js' ran
    1.05 ± 0.01 times faster than 'node c.js'
➜ cat func.js
let obj = {a: 10};
 
const hasF = function(object, key) {
    return Object.prototype.hasOwnProperty.call(object, key);
}
for (let i = 0; i < 10 ** 8; i++) {
    hasF(obj, 'a');
    hasF(obj, 'b');
}
➜ cat c.js
let obj = {a: 10};
 
for (let i = 0; i < 10 ** 8; i++) {
    obj.hasOwnProperty('a');
    obj.hasOwnProperty('b');
}

Я даже два раза прогонял, те же 1.05.

Отличие функции от непосредственного вызова Object.prototype.hasOwnProperty.call в районе погрешности. (было бы странно, если бы было иначе).

fernandos ★★★
() автор топика
Последнее исправление: fernandos (всего исправлений: 1)
Ответ на: комментарий от no-such-file

вообще непонятно на какой хер нужно проверять наличие свойства?

This. Для упорышей придумали TS, чтобы шмагли, нет же, используют JS, вырывая гланды через жО…

Not_a_Troll
()
Ответ на: комментарий от Not_a_Troll

тс не панацея, достаточно его делателем где-то обосраться чтобы он нагенерировал проблемного жс, хотя возможно это можно даже сделать просто зная как он генерирует ту или иную конструкцию из тс, в общем в любом случае со всем этим делом надо быть осторожным т.к. в основе все равно жс.

abcq ★★
()
Ответ на: комментарий от Not_a_Troll

Это надо в мавзолей идти, и стакан из мака надо было выиграть, чтобы приложить к вождю и прислушиваться, слишком неподъемная ноша.

abcq ★★
()
Ответ на: комментарий от fernandos

Совершенно не ясно что ты тут пытаешься тестировать. Скорость системных вызовов? Кэширование ОС? Не занимайся ерундой.

https://sun9-72.userapi.com/impg/-VdYcJSURsFZE9q7XQ4Lf1K_Mv1ZzunphxdT4Q/x_A-g-itTf0.jpg?size=951x611&quality=96&sign=22e30442de67fc0f914c5a5cff8b140c

https://sun9-35.userapi.com/impg/jXtoQkFELKTRmRpnUIphoqonrgnDhJg3EVQpLg/8iOObIKxlaE.jpg?size=974x413&quality=96&sign=529697a33551c52a8df8a149b10b7f2d

javascript
()
Ответ на: комментарий от javascript

Совершенно не ясно что ты тут пытаешься тестировать

Насколько вызов функции дорогой. Ожидаемо недорогой.

fernandos ★★★
() автор топика
Ответ на: комментарий от Not_a_Troll

да по факту достаточно просто знать что из себя представляет жс, хотя бы поверхностно в виде «прочитал некогда пату тройку книг про него и его устройство», чтобы понимать что никакой тайпскрипт не сможет вылечить его детские хронические болезни в терминальной стадии.

abcq ★★
()
Ответ на: комментарий от Not_a_Troll

надо было конечно хотя бы так, но с другой стороны, это вообще бессмысленные тесты, никто не будет по 100500 раз в цикле вызывать кол на хасовнпроперти, все это какой-то безумный кейс оптимизации уровня прослушивания тела вождя через стакан.


let obj = {a: 10};

const hasF = function(object, key) {
    return Object.prototype.hasOwnProperty.call(object, key);
}

let start = Date.now();
for (let i = 0; i < 10 ** 10; i+=10 ** 5) {
    hasF(obj, 'a');
    hasF(obj, 'b');
}
let end = Date.now();

console.log(`result function ${end - start}`);

const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
start = Date.now();
for (let i = 0; i < 10 ** 10; i+=10 ** 5) {
    has.call(obj, 'a');
    has.call(obj, 'b');
}
end = Date.now();

console.log(`result cache  ${end - start}`);
abcq ★★
()
Ответ на: комментарий от abcq

При чём тут вообще реальный мир? Я же говорил, интересно было заменить ту дрянь, которую наваяли в has с 15 миллионами скачиваний, одной функцией без значительной (ну, типа чтобы не секунду считалось, никакой идиот не будет 10^8 раз проверять наличие свойств) потери производительности, что сделать и удалось.

i < 10 ** 10; i+=10 ** 5

Красота, все такты процессора пошли в бой.

fernandos ★★★
() автор топика
Ответ на: комментарий от fernandos

ну мне было лень ждать и я немного подправил это дело, хотя в оригинале 10 ** 6 уже сносно для любого онлайн полигона, а вот на ** 8 оно увы захлебывается.

а реальный мир тут при том, что в этом гайде этот кэш совершенно бесполезен с практической стороны дела, т.к. действительно вряд ли где-то будет многократно вызываться подобный код линейно в один промежуток времени, много на этом не сэкономить.

abcq ★★
()
Последнее исправление: abcq (всего исправлений: 1)

Читаю Airbnb JavaScript Style Guide, дохожу до пункта 3.7

cache the lookup once, in module scope.

ни читай каку. Подобные оптимизации уже давным давно не актуальны и, возможно, даже вредят, что в ноде, что в браузерах.

То что все используют готовый трёшстрочник. На самом деле не так плохо. Я помню в старом проекте считал суммарное кол-во реализация isNumber было что-то около 20. Если тогда это не было проблемой, то сейчас, если каждый модуль будет реализовывать, все эти трёхстрочники, то это уже будет проблемой ибо модулей может быть тысячи. А дальше будет только хуже, так что максимально использовать общее это весьма помогает js тормозить не так сильно как он мог бы.

vtVitus ★★★★★
()
Последнее исправление: vtVitus (всего исправлений: 1)
Ответ на: комментарий от fernandos

https://byko3y.github.io/simple_DOM_benchmark/func.html

Здесь твоя самая быстрая и моя. Просто выделываться не нужно, и дальше браузер сам разберется:

$ node --version
v12.22.6
$ node func.js
Call to func_js took 1356.7988420128822 milliseconds
Call to byko3y_js took 1191.7083119750023 milliseconds

Firefox 95.0.2 (64 бита)
Call to func_js took 79 milliseconds
Call to byko3y_js took 58 milliseconds

Chromium Версия 82.0.4045.0 (64 бит)
Call to func_js took 1427.3749999993015 milliseconds
Call to byko3y_js took 1302.2999999811873 milliseconds

Справедливости ради, объекты в V8 лучше оптимизированы, но в ущерб этому самому hasOwnProperty.

byko3y ★★★★
()
Последнее исправление: byko3y (всего исправлений: 1)
Ответ на: комментарий от abcq

ну мне было лень ждать и я немного подправил это дело, хотя в оригинале 10 ** 6 уже сносно для любого онлайн полигона, а вот на ** 8 оно увы захлебывается

Меня от этих онлайн полигонов на реактах блевать тянет. Тупят, работают не везде и через раз, даже если в браузере не стоит uMatrix. Берешь и запускаешь в браузере — вот и вся история.

byko3y ★★★★
()
Ответ на: комментарий от vtVitus

То что все используют готовый трёшстрочник. На самом деле не так плохо. Я помню в старом проекте считал суммарное кол-во реализация isNumber было что-то около 20. Если тогда это не было проблемой, то сейчас, если каждый модуль будет реализовывать, все эти трёхстрочники, то это уже будет проблемой ибо модулей может быть тысячи. А дальше будет только хуже, так что максимально использовать общее это весьма помогает js тормозить не так сильно как он мог бы.

Дык тогда собираете такого библиотеку и публикуете на гитхабе. В жс же можно импортировать одну функцию? Публикация пакета из 3-х строк, ещё и такого странного — дикость.

ни читай каку

Да хотел хоть примерно прикинуть, как принято в жс, тянуть привычки из других яп — моветон.

fernandos ★★★
() автор топика
Последнее исправление: fernandos (всего исправлений: 1)
Ответ на: комментарий от byko3y

Просто выделываться не нужно, и дальше браузер сам разберется

Я же не выделываюсь, мне просто не нравится факт плохой рекомендации по стилю кода, на который ссылается МДН. Вы же не думаете, что я собираюсь использовать или как-то распространять самописную функцию?

fernandos ★★★
() автор топика
Ответ на: комментарий от fernandos

мне просто не нравится факт плохой рекомендации по стилю кода, на который ссылается МДН

Где ссылается?

byko3y ★★★★
()
Ответ на: комментарий от byko3y

ну у репл режимов неудобно простыни туда копировать, вскод запускать тоже лениво, онлайн самое то, открыл вкладку рядом и готово + запускаешься не у себя если код скажем понятен не сразу до конца, бывает же и такое, еще у онлайн полигонов часто есть возможность кинуть ссылку на пример, ну а по поводу того что тормозит, пока не особо замечаю это, железо менял год назад.

abcq ★★
()
Ответ на: комментарий от fernandos

Публикация пакета из 3-х строк, ещё и такого странного — дикость.

Это общий подход. Трехстрочники, четырех, пяти ... В ранних нода проектах было по 5-8 разных реализаций только одного промиса от разных васянов и не совместимых (что не самое страшное, самое страшное иногда частично совместимых) между собой. Без выработки такого подхода нода и пакетная система ужо бы сдохла под своим весом. А так ещё дёргаются :D

vtVitus ★★★★★
()
Ответ на: комментарий от fernandos

If you want something that goes into more detail, we’d recommend the AirBnB JavaScript Style Guide, which is generally compatible with our guidelines

А, ну да, так-то неудивительно, в мозиле тоже не умеют хорошо писать на JS.

byko3y ★★★★
()

Пять строк с зависимостью

В этой строчке только точки.  
Сказать хотел, но не успел ...
anonymous
()
Ответ на: комментарий от byko3y

А, ну да, так-то неудивительно, в мозиле тоже не умеют хорошо писать на JS.

Так потому так и называется! …

МАЗИЛА! ...
anonymous
()

Во втором варианте сама проверка на 5 символов меньше, но для этого в проект надо тянуть две библиотеки, первая состоит из 5 строк

Тупорылые макаки, сэр. Можете класть прибор на все их потуги.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.