Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Collection – фреймворк для управления данными (https://javascript.ru/forum/project/27848-collection-%E2%80%93-frejjmvork-dlya-upravleniya-dannymi.html)

tenshi 31.10.2012 02:39

кстати, я так понимаю все выборки осуществляются перебором?
тогда вот ещё одна ссылка в тему: http://javascript.ru/blog/tenshi/yavascriptovoe-dao
реализация ужасная, но идеи стоит взять на заметку

kobezzza 31.10.2012 09:48

Цитата:

Сообщение от tenshi (Сообщение 213198)
кстати, я так понимаю все выборки осуществляются перебором?
тогда вот ещё одна ссылка в тему: http://javascript.ru/blog/tenshi/yavascriptovoe-dao
реализация ужасная, но идеи стоит взять на заметку

О, ты начал говорить по существу. Стратегия поиска данных может быть разной, я специально не делал этого автоматически, чтобы сохранить гибкость: можно делать полные переборы, а можно делать выборки по множеству ссылок, можно переборы в интервалах, можно разводить поиск данных по потокам, можно делать индексы и управлять ими с помощью контекстного API. Для каждого случая нужно самому выбирать стратегию или написать специальный драйвер надстройку, как это делают, например, для монги. Сами циклы я стараюсь максимально оптимизировать, вот сейчас серьёзно думаю о неблокирующих режимах "из коробки", т.е. поддержка воркеров и таймаутов (первые, я думаю дадут серьёзный прирост производительности). Реализация неплохая (но до хорошо, мне пока ещё работать и работать), я сам понимаю, где есть узкие места, думаю над их решениями. Я почитаю твою статью и возможно подчеркну из неё что нить полезное, спасибо за ссылку.

UPD: почитал по ссылке, у меня всё также, кроме отсутствия ключей объектов (я такие объекты называю "гибридными" за то, что они содержат сильные стороны массивов и хешей), но их реализацию я уже давно задумал добавить в версию 4 своей либы, вместе с поддержкой воркеров. Ты бы почитал мануал на моем сайте, чтобы лучше понять, что же я сделал :) И я совсем не против объективных и трезвых советов.

B~Vladi 31.10.2012 11:23

Цитата:

Сообщение от tenshi
смешивать трансформацию модели (из дата ориентированной во вью ориентированную) и шаблонизацию

Речь не о трансформации, а о фильтрации и группировке.

Цитата:

Сообщение от tenshi
смешивать эти два процесса - это классно лишь на простеньких демо-примерах.

Конкретные аргументы/примеры есть? Я знаю инструмент, который позволяет эффективно выполнить оба процесса в условиях большого высоконагруженного проекта. И я каждый день им пользуюсь. Так что твои слова для меня пока только слова.

Цитата:

Сообщение от tenshi
нужно создать модель представления, которая:

Модель всё равно вернёт data-ориентированные данные, так что это не выход. А если модель будет ещё и превращать их во view-ориентированные, то:
Цитата:

Сообщение от tenshi
(привет, копипаста)



Цитата:

Сообщение от tenshi
у тебя будет 2 шаблона отличающихся лишь запросами данных (привет, копипаста). будет 2 отдельные выборки из базы (привет, тормоза). в то время как логика подсказывает, что эффективней было бы один раз пройтись по массиву, раскидав записи по двум одинаковым моделям и отрендерить их одним же шаблоном.

"У меня" будет один шаблон, один запрос и две фильтрации.

tenshi 31.10.2012 12:03

> у меня всё также

как же создаются ключи?

> Речь не о трансформации, а о фильтрации и группировке.

одним словом это - выборка данных

> Я знаю инструмент, который позволяет эффективно выполнить оба процесса в условиях большого высоконагруженного проекта.

что же это за волшебное средство?

> Модель всё равно вернёт data-ориентированные данные

модель представления вернёт вью ориентированные данные. это яваскрипт, используй силу функции, люк, чтобы не было копипасты)

> "У меня" будет один шаблон, один запрос и две фильтрации.

Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds.

kobezzza 31.10.2012 12:20

Цитата:

Сообщение от tenshi (Сообщение 213222)
как же создаются ключи?

Формат данных у меня - произвольный JSON, т.е. сам пользователь выбирает, что ему удобней юзать: массив или хеш, но все методы работают как с тем, и с другим, но ввиду их особенностей в разных ситуациях кто-то работает значительно быстрее (перебор быстрее во много-много раз для массивов, но хеши позволяют делать прямые ссылки). Для ключей у меня реализовано контекстное АПИ, если коротко, то это конкретизация поиска, если с умом юзать этот механизм, то проблем со скоростью в рамках клиентской БД не будет вообще никогда (т.е. автоматически у меня не создаются зависимости и ключи, но АПИ для этого есть, чтобы разработчик сам решил, что и как ему сделать).

И не забывай, что мой фреймворк можно юзать, как простой фреймворк данных (новые методы работы с массивами и объектами) или абстрактно представлять как некоторую БД, как удобнее и лучше должен решать сам разработчик.

// Все чётные элементы увеличить на 1 (вместо строковых сокращений функций моно юзать простые функции)
$C([1,2,3,4,5,6,7]).forEach(':data[i]++', ':el % 2 == 0');


Сейчас есть проблемы при тупом переборе более 10к элементов за раз, но после внедрения воркеров я думаю проблема исчезнет (в рамках клиентских задача вряд ли будут коллекции по 10кк элементов).

B~Vladi 31.10.2012 13:18

Цитата:

Сообщение от tenshi
что же это за волшебное средство?

Ты не поверишь, XSLT.

Цитата:

Сообщение от tenshi
модель представления вернёт вью ориентированные данные

Привет, копипаста моделей.

Цитата:

Сообщение от tenshi
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds.

Охх... Ну смотри:

<?xml version="1.0" encoding="UTF-8"?>
<ten:root xmlns:ten="TEN" xmlns="http://www.w3.org/1999/xhtml">
  
  <!-- Один шаблон для списка пользователей, может лежать в отдельном файле -->
  <ten:block name="user-list">
    <ul>
      <ten:each array="this" item="user">
        <li><ten:echo data="user.name" /></li>
      </ten:each>
    </ul>
  </ten:block>
  
  <!-- Одна выборка всех пользователей. Если бы нам потребовались только совершеннолетние, в методе getUsers можно реализовать параметры fromAge и toAge. Пример приводить не буду -->
  <ten:async method="getUsers" arguments="userList">
    <ten:context object="new Collection(userList)">

      <!-- Первый список, первая фильтрация -->
      <ten:render block="user-list" context="this.get(':el.age < 18')" />

      <!-- Второй список, вторая фильтрация -->
      <ten:render block="user-list" context="this.get(':el.age >= 18')" />

    </ten:context>
  </ten:async>

</ten:root>


Ну и сама разметка списка может быть кастомизирована для каждого конкретного случая.
В итоге:
Цитата:

Сообщение от B~Vladi
"У меня" будет один шаблон, один запрос и две фильтрации.

И никакой копипасты.

Такой подход используется и в XSL.

tenshi 31.10.2012 15:10

> АПИ для этого есть

где про него почитать?

> $C([1,2,3,4,5,6,7]).forEach(':data[i]++', ':el % 2 == 0');

не убедительно
[1,2,3,4,5,6,7].map(fucntion( val ){ return ( el % 2 ) ? el : el + 1 })


> после внедрения воркеров я думаю проблема исчезнет

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

kobezzza 31.10.2012 15:20

Цитата:

Сообщение от tenshi (Сообщение 213251)
где про него почитать?

На сайте в учебнике

Цитата:

Сообщение от tenshi (Сообщение 213251)
не убедительно

Я привёл элементарный пример, он где угодно элементарно решается, а вот сложный делать стандартными методами ты запаришься, а у меня всё та же одна строчка (например, начиная с конца массива, отбросив первые 10 успешных итераций и если итерация меньше 20-ти применить сортировку по фильтру и возвести в n степень). Ты придираешься к словам, вместо того, чтобы прочитать учебника и не задавать мне глупых вопросов.

Цитата:

Сообщение от tenshi (Сообщение 213251)
и куда же она денется? вместо использования ключей для быстрой выборки, ты выносишь перебор в асинхронную задачу, превращая клиентский код в лапшу из колбэков.

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

Я не навязываю стратегию решения задачи, разработчик сам решает что и как ему сделать. Тебе не нравится моя либа, т.к. ты писал свой велосипед, который никому кроме тебя не нужен, более того судя по кол-ву комментов люди даже не поняли, что ты хотел написать, у тебя нет ни доки ни мана, даже ссылка битая, о чём тут ещё говорить?

tenshi 31.10.2012 15:24

> Ты не поверишь, XSLT.

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

> Привет, копипаста моделей.

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

tenshi 31.10.2012 15:45

> Один шаблон для списка пользователей, может лежать в отдельном файле

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

> Одна выборка всех пользователей. Если бы нам потребовались только совершеннолетние, в методе getUsers можно реализовать параметры fromAge и toAge. Пример приводить не буду

а тут формируешь две модели и рендеришь их. то же самое на js могло бы выглядеть проще:

var AllUsersModel= Model( function ( userList ){
    var model= { mature: [], amature= [] }

    userList.forEach( function( user ){
        model[ ( user.age >= 18 ) ? 'mature' : 'amature' ].push( user )
    }

    return model
} )
AllUsersModel( userList ).renderTo( place )

tenshi 31.10.2012 15:54

> Одна выборка всех пользователей.

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

и вообще ты тут изобрёл хмл-велосипед - на яваскрипте этот код выглядит куда лаконичней:

this.renderUsers= function( userlist ){
    var users= new Collection(userList)
    this.renderUserList( user.get(':el.age >= 18') )
    this.renderUserList( user.get(':el.age < 18') )
}

B~Vladi 31.10.2012 15:55

Цитата:

Сообщение от tenshi
она в любом случае будет

Где в моем примере копипаста?

Цитата:

Сообщение от tenshi
открой для себя хотябы двухпроходной xslt - это классно

Это отстой. А с чего ты взял, что я с этим не знаком? Судя по твоим словам, ты с другими подходами не сталкивался.

Ты, случайно, не из команды лего? Они как раз любят так делать.

tenshi 31.10.2012 16:00

> На сайте в учебнике

конкретной ссылки я так и не дождусь? скажи ещё "всё есть в интернете"

> например, начиная с конца массива, отбросив первые 10 успешных итераций и если итерация меньше 20-ти применить сортировку по фильтру и возвести в n степень

как это будет выглядеть с использованием сабжа?

> Проблема больших данных - это проблема архитектуры приложения, а не моей библиотеки

ок, так бы и написал, что для больших данных она не предназначена. вопросов больше нет.

B~Vladi 31.10.2012 16:05

Цитата:

Сообщение от tenshi
то же самое на js могло бы выглядеть проще

Где же проще? У тебя получается 2 цикла (внутри renderUserList) + forEach, а у меня всего 2 цикла. К тому же этот код ты будешь копипастить для каждого случая.

И если оно проще выглядит - это не значит, что проще разрабатывается и поддерживается.

Цитата:

Сообщение от tenshi
вместо группировки как у меня

Если Collection позволяет так группировать - будет "как у тебя".

Цитата:

Сообщение от tenshi
на яваскрипте этот код выглядит куда лаконичней

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

kobezzza 31.10.2012 16:24

Цитата:

Сообщение от tenshi (Сообщение 213268)
конкретной ссылки я так и не дождусь? скажи ещё "всё есть в интернете"

http://www.collection-js.com/manual/part-3.html
http://www.collection-js.com/manual/part-5.html

Цитата:

Сообщение от tenshi (Сообщение 213268)
как это будет выглядеть с использованием сабжа?

http://www.collection-js.com/manual/part-2.html

Цитата:

Сообщение от tenshi (Сообщение 213268)
ок, так бы и написал, что для больших данных она не предназначена. вопросов больше нет.

Слив засчитан.

tenshi 31.10.2012 16:24

> Где в моем примере копипаста?

там где ты делаешь запросы и рендеришь шаблоны. за показа "всех пользователей сообщества такого-то" тебе и мне придётся этот блок копипастить и допиливать

> А с чего ты взял, что я с этим не знаком?

потому что говоришь, что
> Это отстой.

> Ты, случайно, не из команды лего? Они как раз любят так делать.

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

к слову, я сейчас не использую 2 прохода, ибо браузеры не поддерживают exslt, и очень от этого страдаю. приходится извращаться с mode(

kobezzza 31.10.2012 16:30

Цитата:

Сообщение от B~Vladi (Сообщение 213270)
Если Collection позволяет так группировать - будет "как у тебя".

Позволяет:)

tenshi 31.10.2012 16:30

> У тебя получается 2 цикла (внутри renderUserList) + forEach, а у меня всего 2 цикла.

выборка в Collection как мы выяснили происходит без ключей, а значит будет перебор всего массива в цикле

> И если оно проще выглядит - это не значит, что проще разрабатывается и поддерживается.

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

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

а это не важно где, хоть в xml конфиге, хоть в json, главное - не мешать её с шаблонами.

tenshi 31.10.2012 16:31

> Если Collection позволяет так группировать - будет "как у тебя".

пример кода?

kobezzza 31.10.2012 16:33

Цитата:

Сообщение от tenshi (Сообщение 213277)
пример кода?

// Сгруппировать по отношению старше/младше
// и выбрать по ключу
group(':el.age > 18').get('true')


Цитата:

Сообщение от tenshi (Сообщение 213277)
выборка в Collection как мы выяснили происходит без ключей, а значит будет перебор всего массива в цикле

Мы выяснили, что ты не умеешь читать

tenshi 31.10.2012 16:36

> http://www.collection-js.com/manual/part-3.html
> http://www.collection-js.com/manual/part-5.html

я не увидел там ничего про ключи. можешь привести пример, как выбрать всех юзеров старше 18 лет за O(log n)?

>> как это будет выглядеть с использованием сабжа?
> http://www.collection-js.com/manual/part-2.html

приведи код, а не ссылку

kobezzza 31.10.2012 16:37

Цитата:

Сообщение от tenshi (Сообщение 213280)
я не увидел там ничего про ключи. можешь привести пример, как выбрать всех юзеров старше 18 лет за O(log n)?

get(название ключа)

tenshi 31.10.2012 16:37

> // Сгруппировать по отношению старше/младше
> // и выбрать по ключу
> group(':el.age > 18').get('true')
я просил код шаблона. пофиг как делать группировку.

tenshi 31.10.2012 16:38

> get(название ключа)

как создать ключ?

kobezzza 31.10.2012 16:41

Цитата:

Сообщение от tenshi (Сообщение 213284)
> get(название ключа)

как создать ключ?

Как хочешь, статически (например ручками указав хеш) или динамически (например через группировку).

B~Vladi 31.10.2012 17:10

Цитата:

Сообщение от tenshi
потому что говоришь, что

Не засчитано.

Цитата:

Сообщение от tenshi
но я рад, что они таки решились отделить мух от котлет

Это не единственное и не самое верное решение. Видимо, ты не в курсе про layout-ы. Так что преимущества двухпроходного XSL не раскрыты.

Цитата:

Сообщение от kobezzza
Позволяет

Ну вот, тем более.

Цитата:

Сообщение от tenshi
полноценный язык программирования всяко проще разрабатывается и поддерживается

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

Цитата:

Сообщение от tenshi
сильно ограниченный xml велосипед

Это голословно.

Цитата:

Сообщение от tenshi
а это не важно где

Как раз-таки важно. XML и JSON ещё куда ни шло, а вот программный код - это уже попахивает диагнозом "говнокодер".

tenshi 01.11.2012 00:15

> Как хочешь, статически (например ручками указав хеш) или динамически (например через группировку).

зайдём с другого конца..

var c= new Collection([ /* over 9000 */ ])
...
c.add({ name: 'bob', age: 18 })
...
var mature= c.get( ':el.age >= 18' )


что нужно приписать сюда, чтобы выборка в конце происходила за O( log n )

tenshi 01.11.2012 00:28

> Видимо, ты не в курсе про layout-ы.

рассказывай

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

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

> Это голословно.

рискнёшь доказать полноту по тьюрингу?

> а вот программный код - это уже попахивает диагнозом "говнокодер"

с каких пор програмный код не годится для описания моделей данных?

ты так и не ответил на вопрос:
>> Если Collection позволяет так группировать - будет "как у тебя".
> пример кода?

kobezzza 01.11.2012 00:58

Цитата:

Сообщение от tenshi (Сообщение 213381)
зайдём с другого конца..

var c= new Collection([ /* over 9000 */ ])
...
c.add({ name: 'bob', age: 18 })
...
var mature= c.get( ':el.age >= 18' )


что нужно приписать сюда, чтобы выборка в конце происходила за O( log n )

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

Из мана на сайте либы:
// Создадим коллекцию, каталог музыкальных иснтрументов:
// первичный уровень таблицы будет хеш-таблицей, где ключ — тип инструмента
var db = new Collection({
	guitar: {
		fender: [
			{model: 'JAGUAR BLACKTOP HH RW BLK', price: 27921},
			{model: 'STRATOCASTER BLACKTOP HH MN BLK', price: 28390},
			{model: 'STANDARD TELECASTER ', price: 18518}
		],
		gibson: [
			{model: 'CUSTOM SHOP LES PAUL CUSTOM EB/GH', price: 159505},
			{model: 'LES PAUL STUDIO FIREBURST CHROME HARDWARE', price: 50525}
		]
	},
	bassGuitar: {
		fender: [
			{model: 'STANDARD JAZZ BASS RW Sunburst', price: 32205},
			{model: 'STANDARD PRECISION BASS', price: 30640}
		]
	}
});

// Теперь выберем все гитары фирмы fender
// для этого сделаем прямой запрос через get
db.get('guitar > fender');

// Выберем модели, дешевле 20-ти тысяч
db.get(':el.price < 20000'); // Ошибка, свойство price не найдено,
                             // Т.к. отсчёт идёт с самого первого объекта, а не с guitar > fender

// Чтобы установить нужную точку отсчёта, установим активный контекст
db.newContext('guitar > fender');

// Теперь снова сделаем get запрос
db.get(':el.price < 20000'); // Всё ок, т.к. теперь задан нужный контекст обхода

// В случае задания в get прямой ссылки, она также будет теперь отталкиваться от активного контекста
db.get('guitar > fender > 0'); // Ошибка
db.get('0'); // Вернёт запрашиваемый элемент


А теперь скажи, раз у тебя такая упер-пупер либа, как ты сделаешь выбор типа LIKE по произвольному полю без переборов?

PS: А вообще я устал с тобой спорить, я знаю такой тип людей, вроде тебя, и знаю что это глупое занятие. Общайся сам с собой, а я буду общаться с адекватными людьми.

tenshi 01.11.2012 02:27

> Укажи в конструктор не массив, а хеш, где ключи являются возрастом и будет тебе счастье.

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

а вот задание на две пятёрки:

var c= new Collection([ /* over 9000 */ ])
...
c.add({ name: 'bob', age: 18 })
...
var mature= c.get( ':el.age >= 18' )
var rich= c.get( ':el.salary >= 9000' )


условия те же - O( log n )

> как ты сделаешь выбор типа LIKE по произвольному полю без переборов?

поисковые системы же это как-то делают

kobezzza 01.11.2012 12:10

Цитата:

Сообщение от tenshi (Сообщение 213396)
> Укажи в конструктор не массив, а хеш, где ключи являются возрастом и будет тебе счастье.

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

а вот задание на две пятёрки:

var c= new Collection([ /* over 9000 */ ])
...
c.add({ name: 'bob', age: 18 })
...
var mature= c.get( ':el.age >= 18' )
var rich= c.get( ':el.salary >= 9000' )


условия те же - O( log n )

> как ты сделаешь выбор типа LIKE по произвольному полю без переборов?

поисковые системы же это как-то делают

1) .groupLinks(параметр, сохраняем индексы).get(делаем запрос по вторичным индексам). Т.е. чтобы юзать вторичные ключи, их нужно для начала создать, у тебя же это судя по всему делается сразу в конструкторе вызывая дополнительную не нужную нагрузку (и тормоза).

2) вопрос не про поисковые системы, а про твою мистическую супер-упер либу, поэтому опять ты слился.

B~Vladi 01.11.2012 12:28

Цитата:

Сообщение от tenshi
рассказывай

Гугли.

Цитата:

Сообщение от tenshi
рискнёшь доказать полноту по тьюрингу?

Тебе нет.

Цитата:

Сообщение от tenshi
ты так и не ответил на вопрос:

Я не знаю как так сгруппировать в Collection, поэтому примера не будет.

kobezzza 01.11.2012 12:36

Цитата:

Сообщение от B~Vladi (Сообщение 213435)
Я не знаю как так сгруппировать в Collection

Нужно сгруппировать людей по параметру старше/младше 18-ти?

// Вызываем метод group, и параметром указываем условие, в итоге создастся новая коллекция с ключами true и false, которые будут содержать результат группировки
.group(':el.age > 18')
// Старше 18
.get('true')
// Младше
.get('false')


// Можно делать ключи по более сложным условиям,
// т.к. ключи создаются по возвращаемому параметру условия,
// то можно создать множество ключей, например, с помощью тернарного оператора
// (разумеется можно писать простые функции или юзать разбиение на атомарные через стек)
.group(':el.age > 18 ? more18 : el.age < 12 ? less12 : less18')

kobezzza 01.11.2012 22:45

Проводил замеры создания инстанса, 1 миллион итераций.
Вышло примерно так:
1) ИЕ 10 ~ 15 сек
2) FF 16 ~ 20 сек
3) Chrome 22 ~ 24 сек
4) Opera 12 ~ 50 сек

Начал оптимизировать логику конструктора:
1) Разложил if-ы по логической вложенности;
2) Заменил первичное копирование свойств с extend (рекурсивная реализация) на Object.create (с указанием прототипа, там где нет, написал свою реализацию).

Итого:
1) Opera 12 ~ 0.4 сек
2) Chrome 22 ~ 0.8 сек
3) IE 10 ~ 1 сек
4) FF 16 ~ 1.4 сек

Для теста на сафари 6 лень было мак брать (тем более его юзала мама:) ). Основные тормоза разумеется вызывала рекурсия.

PS: после оптимизации логика конструктора осталась идентичной.

B~Vladi 02.11.2012 00:07

Цитата:

Сообщение от kobezzza
Основные тормоза разумеется вызывала рекурсия.

Естественно. Я всегда заменяю рекурсию на цикл, когда это возможно.

Цитата:

Сообщение от kobezzza
после оптимизации логика конструктора осталась идентичной.

Т.е. таки он по-прежнему возвращает экземпляры с разным набором свойств?

kobezzza 02.11.2012 00:27

Цитата:

Сообщение от B~Vladi (Сообщение 213608)
Естественно. Я всегда заменяю рекурсию на цикл, когда это возможно.

Рекурсия выглядит просто и лаконично, если не нужна сильная производительность, то я обычно оставляю всё как есть:)

Цитата:

Сообщение от B~Vladi (Сообщение 213608)
Т.е. таки он по-прежнему возвращает экземпляры с разным набором свойств?

Ну, мб я не совсем тебя понял. Сейчас в общем всегда одинаковые свойства, но есть возможность изменить, указав второй параметр (по умолчанию это не делает), убрать можно, но мне не совсем понятно в чём профит? Скорость создания инстанса почти не увеличится (просто выкинется одно условие) или за ширмой что-то ещё?

B~Vladi 02.11.2012 00:42

Цитата:

Сообщение от kobezzza
но мне не совсем понятно в чём профит? Скорость создания инстанса почти не увеличится (просто выкинется одно условие) или за ширмой что-то ещё?

В том то и дело, что кое-что "за ширмой" есть: http://habrahabr.ru/post/154537/, Пункт "Скрытые классы".

Вывод: объекты, созданные в конструкторах, всегда должны иметь одинаковый набор свойств и не менять этот набор в течении жизни программы. Производительность увеличивается на порядки. А если сделать вывод более общим - писать код нужно так, как если вы бы писали его на C++ или Java, касаемо объектов и их конструкторов.

kobezzza 02.11.2012 00:53

Цитата:

Сообщение от B~Vladi (Сообщение 213616)
В том то и дело, что кое-что "за ширмой" есть: http://habrahabr.ru/post/154537/, Пункт "Скрытые классы".

Вывод: объекты, созданные в конструкторах, всегда должны иметь одинаковый набор свойств и не менять этот набор в течении жизни программы. Производительность увеличивается на порядки. А если сделать вывод более общим - писать код нужно так, как если вы бы писали его на C++ или Java, касаемо объектов и их конструкторов.

О спасибо за ссылку, теперь всё стало ясно:)

B~Vladi 02.11.2012 00:54

Цитата:

Сообщение от kobezzza
Рекурсия выглядит просто и лаконично

Да, и это искушает JS-программистов. forEach/map/reduse тоже выглядят просто и лаконично, но JS-движки не раскладывают их на циклы (по крайней мене V8 точно), поэтому производительность стремительно падает. Мы на маркете после замены forEach на for выиграли кучу времени для RPS. При том, что на сервере не V8, а движок от Mozilla (не уверен что это Rhino). Так что иногда стоит жертвовать читабельностью ради производительности. Тем более в библиотеках.

Мое имхо такое: библиотеки должны в первую очередь обеспечивать высокую производительность в ущерб читабельности. Яркий тому пример - jQuery.

tenshi 02.11.2012 01:03

> .groupLinks(параметр, сохраняем индексы).get(делаем запрос по вторичным индексам).

это псевдокод. что конкретно туда писать?
в любом случае, похоже выборка будет O(n)

> у тебя же это судя по всему делается сразу в конструкторе вызывая дополнительную не нужную нагрузку (и тормоза)

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

> вопрос не про поисковые системы, а про твою мистическую супер-упер либу

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

> Гугли.

что именно?

> Тебе нет.

почему?


Часовой пояс GMT +3, время: 06:46.