Re[6]: ответ на вопрос: Почему новые программы работают меделнно
От: hattab  
Дата: 29.06.12 04:09
Оценка: +1
Здравствуйте, Mamut, Вы писали:

M> Ops>90% покрывает константность/константные ссылки. Остальное да, надо тратить время, продумывая поведение. Зато можно дешево if(s[0]=='a') s[0]='b';


M> Только вот даром эта дешевость никому не нужна. Потому что все давно живут в эпоху юникода и s[0] == 'ö' уже не прокатит.


Мамут забавный. Смотри, показываю один раз:
var s : UnicodeString; // WideString
begin

 s := '中文';

 if s[1] = '中' then
  s[1] := '文';

end;


В чем проблема-то? Строки с двухбайтовым символом, покрывают весь BMP. Строки с четырехбайтовым символом покрывают весь юникод вообще. Но достаточно и двухбайтового символа т.к. все что за BMP практически не используется.
avalon 1.0rc3 build 428, zlib 1.2.3
Re[18]: ответ на вопрос: Почему новые программы работают мед
От: Pavel Dvorkin Россия  
Дата: 29.06.12 04:46
Оценка:
Здравствуйте, hattab, Вы писали:

Возможно, ты и прав, но все эти отличия примерно те же, что и для ранней версии С++ (BC++ 2.0) vs версии времен BC++5.0.
With best regards
Pavel Dvorkin
Re[27]: ответ на вопрос: Почему новые программы работают меделнно
От: MxMsk Португалия  
Дата: 29.06.12 05:31
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>то для 10000 должно быть в 100 раз больше, то есть 500 секунд. Запусти, завтра скажешь, когда закончилась. А может, не завтра

Павел, будут ли комментарии к этому
Автор: MxMsk
Дата: 27.06.12
решению?
Re[19]: ответ на вопрос: Почему новые программы работают мед
От: hattab  
Дата: 29.06.12 05:54
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD> Возможно, ты и прав, но все эти отличия примерно те же, что и для ранней версии С++ (BC++ 2.0) vs версии времен BC++5.0.


Мой интерес к сям пропал раньше, чем вышел BC++5.0
avalon 1.0rc3 build 428, zlib 1.2.3
Re[7]: ответ на вопрос: Почему новые программы работают меделнно
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 29.06.12 06:14
Оценка: +4 -1
Здравствуйте, hattab, Вы писали:

M>> Только вот даром эта дешевость никому не нужна. Потому что все давно живут в эпоху юникода и s[0] == 'ö' уже не прокатит.


H>Мамут забавный. Смотри, показываю один раз:


Это ты забавный.

H>В чем проблема-то? Строки с двухбайтовым символом, покрывают весь BMP.


Ты лучше покажи, что будет, если ты попытаешься в строке "ёкарный трамвай" заменить s[0] таким методом. При том, что она набрана следующим образом:

$ echo 'ёкарный трамвай' | iconv -t utf-16be | hd
00000000 04 35 03 08 04 3a 04 30 04 40 04 3d 04 4b 04 39 |.5...:.0.@.=.K.9|
00000010 00 20 04 42 04 40 04 30 04 3c 04 32 04 30 04 39 |. .B.@.0.<.2.0.9|
00000020 00 0a |..|
00000022

и видимая тобой "ё" представляет сумму 0435 (е) и 0308 (две точки сверху).

Это я так тонко, не используя специальных терминов, намекнул на тему Normalization forms.

H>Строки с четырехбайтовым символом покрывают весь юникод вообще.


Нету в юникоде "двухбайтового символа" или "четырёхбайтового символа". Символ может быть хоть 20-байтовым, потому что состоит из базового кодового пункта и модификаторов.

А ты продолжаешь считать, что символ == кодовый пункт. Ну что ж, до первого столба.
The God is real, unless declared integer.
Re[8]: ответ на вопрос: Почему новые программы работают меделнно
От: hattab  
Дата: 29.06.12 06:36
Оценка:
Здравствуйте, netch80, Вы писали:

n> Ты лучше покажи, что будет, если ты попытаешься в строке "ёкарный трамвай" заменить s[0] таким методом. При том, что она набрана следующим образом:


n> $ echo 'ёкарный трамвай' | iconv -t utf-16be | hd

n> 00000000 04 35 03 08 04 3a 04 30 04 40 04 3d 04 4b 04 39 |.5...:.0.@.=.K.9|
n> 00000010 00 20 04 42 04 40 04 30 04 3c 04 32 04 30 04 39 |. .B.@.0.<.2.0.9|
n> 00000020 00 0a |..|
n> 00000022

n> и видимая тобой "ё" представляет сумму 0435 (е) и 0308 (две точки сверху).


NormalizeString, а дальше, как обычно.
avalon 1.0rc3 build 428, zlib 1.2.3
Re[9]: ответ на вопрос: Почему новые программы работают меделнно
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 29.06.12 06:43
Оценка:
Здравствуйте, hattab, Вы писали:

H>NormalizeString, а дальше, как обычно.


Переупрощаешь. Нормализация может дать и несколько символов.
Именно посимвольные сравнения начинают терять смысл, остаются только поиски подстрок. А это дороже.
The God is real, unless declared integer.
Re[21]: ответ на вопрос: Почему новые программы работают меделнно
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.06.12 06:54
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Именно. Зная структуру данных и алгоритм, сделаю вывод. Увижу массив и линейный цикл — сделаю вывод, что O(N).

Не угадал. Дальше что?
Увидел не массив, а некую структуру CCustomList. Увидел не цикл, а некий вызов типа std::sort(). Какой будет O()?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[10]: ответ на вопрос: Почему новые программы работают меделнно
От: hattab  
Дата: 29.06.12 06:59
Оценка: :)
Здравствуйте, netch80, Вы писали:

n> H>NormalizeString, а дальше, как обычно.


n> Переупрощаешь. Нормализация может дать и несколько символов.

n> Именно посимвольные сравнения начинают терять смысл, остаются только поиски подстрок. А это дороже.

А тут речь не о поиске, а о модификации строки. Тут, вообще говоря, пофиг на нормализации и формы представления т.к. обсуждается мутабельность vs. иммутабельность. А с мутабельными строками можно ведь и группу символов заменить:

 s:='1234567890';
 Delete(s, 5, 3); // удаление трех символов с пятой позиции
 Insert('4321', s, 5); // вставка подстроки в пятую позицию
avalon 1.0rc3 build 428, zlib 1.2.3
Re[28]: ответ на вопрос: Почему новые программы работают меделнно
От: Pavel Dvorkin Россия  
Дата: 29.06.12 08:34
Оценка: +1 -3
Здравствуйте, MxMsk, Вы писали:

MM>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>то для 10000 должно быть в 100 раз больше, то есть 500 секунд. Запусти, завтра скажешь, когда закончилась. А может, не завтра

MM>Павел, будут ли комментарии к этому
Автор: MxMsk
Дата: 27.06.12
решению?


Что-то долго от тебя ответа не было. Я уж думал, что ты и впрямь запустил тот код при N == 10000, и он все еще работает

На то решение комментарий дам, здесь.

Я его пробовал. Работает вполне успешно. Я не сравнивал его по скорости с императивным.

Так что можно подвести итоги.

1. Я не отрицаю, что на LinQ можно написать код более или менее приемлемый. Глупо было бы это отрицать — если бы это было так, LinQ давно бы помер.
2. В то же время я вынужден констатировать, что на LinQ можно написать код, скорость работы которого категорически неприемлема.
3. Никаких критериев, позволяющих сказать, в каком случае скорость будет приемлемой, а в каком нет, я так и не услышал. Кроме совета использовать голову. Использовать голову, конечно, надо, только для императивного кода к этому прилагается еще обширная информация о временнОй сложности тех или иных алгоритмов.
4. Попытка определить временнУю сложность этого несчастного кода, сделанная тобой и Mamut (ты привел численные данные, а он попробовал дать некоторое обоснование) вполне провалилась.

Вот и все.
With best regards
Pavel Dvorkin
Re[29]: ответ на вопрос: Почему новые программы работают меделнно
От: Mamut Швеция http://dmitriid.com
Дата: 29.06.12 08:41
Оценка: +1 -1
PD>1. Я не отрицаю, что на LinQ можно написать код более или менее приемлемый. Глупо было бы это отрицать — если бы это было так, LinQ давно бы помер.
PD>2. В то же время я вынужден констатировать, что на LinQ можно написать код, скорость работы которого категорически неприемлема.

Аналогично для С++, примеры кода тут были

PD>3. Никаких критериев, позволяющих сказать, в каком случае скорость будет приемлемой, а в каком нет, я так и не услышал. Кроме совета использовать голову. Использовать голову, конечно, надо, только для императивного кода к этому прилагается еще обширная информация о временнОй сложности тех или иных алгоритмов.

PD>4. Попытка определить временнУю сложность этого несчастного кода, сделанная тобой и Mamut (ты привел численные данные, а он попробовал дать некоторое обоснование) вполне провалилась.

Это звиздец. http://rsdn.ru/forum/flame.comp/4796524.1.aspx
Автор: MxMsk
Дата: 28.06.12


Провалилась попытка у него. Нуну. Я же говорю, ты видишь ровно только то, что хочешь видеть.


dmitriid.comGitHubLinkedIn
Re[22]: ответ на вопрос: Почему новые программы работают меделнно
От: Pavel Dvorkin Россия  
Дата: 29.06.12 08:43
Оценка: +1 -1
Здравствуйте, Sinclair, Вы писали:

Что-то мы давно с тобой не схватывались

PD>>Именно. Зная структуру данных и алгоритм, сделаю вывод. Увижу массив и линейный цикл — сделаю вывод, что O(N).

S>Не угадал. Дальше что?

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

S>Увидел не массив, а некую структуру CCustomList. Увидел не цикл, а некий вызов типа std::sort(). Какой будет O()?


Антон, ну не стоит так уж. Если уж о sort речь пошла, то в его quicksort имплементации вообще не цикл, а рекурсия (можно и без нее, конечно), но это не помешало еще N лет назад оценить форму зависмости t= f(N) . Аналитически определить, заметь. Что касается std::sort, то вопрос о ее временной зависимости можешь задать в форуме C++, там тебе сильно удивятся и посоветуют пройти заново основы.

Или можешь обратиться в форум "Алгоритмы", там для каждого второго топика обсуждается временнАя зависимость алгоритма от N. Там тебе все, что нужно, объяснят, а меня уволь.
With best regards
Pavel Dvorkin
Re[29]: ответ на вопрос: Почему новые программы работают меделнно
От: MxMsk Португалия  
Дата: 29.06.12 09:36
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>4. Попытка определить временнУю сложность этого несчастного кода, сделанная тобой и Mamut (ты привел численные данные, а он попробовал дать некоторое обоснование) вполне провалилась.

Я сразу утверждал, что код плох и объяснил, почему вменяемый разработчик не стал бы такое делать. На мой взгляд, одно это уже говорит, что оценка изначально плохого кода — дело неблагодарное. Но мы решили потратить время, ок. Да, я упустил из виду Concat, и что? Я не могу ошибаться? Ну, хорошо, я не имел право на ошибку (хотя, учитывая первое предложение, я бы не дал ей даже повода). Однако, Павел, ты разве требовал дать оценку? Не фига подобного. Изнальный вопрос был, какие правила. Теперь ты видишь, какие правила. Такие же, как и у императивного кода. Невнимание к Concat — это моя "студенческая" ошибка, не имеющая никакого отношения к теории.
Re[30]: ответ на вопрос: Почему новые программы работают меделнно
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 29.06.12 09:49
Оценка: 1 (1) +2
Здравствуйте, Mamut, Вы писали:

PD>>4. Попытка определить временнУю сложность этого несчастного кода, сделанная тобой и Mamut (ты привел численные данные, а он попробовал дать некоторое обоснование) вполне провалилась.

M>Это звиздец. http://rsdn.ru/forum/flame.comp/4796524.1.aspx
Автор: MxMsk
Дата: 28.06.12

M>Провалилась попытка у него. Нуну.

Ну да. Постфактум уже что-то объяснили — после того, как я нашёл, что именно надо объяснить.

M>Я же говорю, ты видишь ровно только то, что хочешь видеть.


Интересно, зачем ты откровенно врёшь тогда, когда тривиально можно поднять всю ветку и увидеть связи и последовательность?
Думаешь, что никто не захочет мараться об твою ложь?
The God is real, unless declared integer.
Re[23]: ответ на вопрос: Почему новые программы работают меделнно
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.06.12 09:52
Оценка: 4 (2) +5
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Я вообще-то гаданиями не занимаюсь.

Да ладно.
PD>Если ты хотел сказать, что бывают циклы, при которых массив проходится не весь — ты безусловно прав, но это тривиальность.
Я, естественно, хотел сказать, что за предположение о константности времени выполнения операции a[i] без проверки того, как реализован operator[] для этого a, нужно сразу же отправлять в астрологический колледж.

S>>Увидел не массив, а некую структуру CCustomList. Увидел не цикл, а некий вызов типа std::sort(). Какой будет O()?


PD>Антон, ну не стоит так уж. Если уж о sort речь пошла, то в его quicksort имплементации вообще не цикл,

Бонус за внимательность уходит в зал.
PD>а рекурсия (можно и без нее, конечно), но это не помешало еще N лет назад оценить форму зависмости t= f(N) . Аналитически определить, заметь. Что касается std::sort, то вопрос о ее временной зависимости можешь задать в форуме C++, там тебе сильно удивятся и посоветуют пройти заново основы.
О, воинствующая некомпетентность на марше. На всякий случай напомню, что стандарт C++ описывает не "временную зависимость", а количество сравнений. Которое, кстати, может в плохих случаях достигать N^2.
А временная зависимость будет очень шибко зависеть от реализации компаратора и оператора [] классе скормленных в std::sort итераторов.
В частности, связный список будет сортироваться std::sort-ом вовсе не за O(NlogN). А не заглядывая в реализацию ССustomList ты никаких предположений о его внутреннем устройстве сделать не сможешь. Это тебе не C, где a[i] всегда равно i[a].
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[31]: ответ на вопрос: Почему новые программы работают меделнно
От: MxMsk Португалия  
Дата: 29.06.12 09:59
Оценка: +1
Здравствуйте, netch80, Вы писали:

N>Ну да. Постфактум уже что-то объяснили — после того, как я нашёл, что именно надо объяснить.

Лично у меня, как и у многих других, просто не было желания тратить время на дальнейшее разбирательство в коде. Знаешь почему? Потому что было очевидно, что Павлу этого не надо. Вот когда ты включился, тогда появилась заинтересованность.
Re[29]: ответ на вопрос: Почему новые программы работают меделнно
От: Mamut Швеция http://dmitriid.com
Дата: 29.06.12 10:01
Оценка:
PD>3. Никаких критериев, позволяющих сказать, в каком случае скорость будет приемлемой, а в каком нет, я так и не услышал. Кроме совета использовать голову. Использовать голову, конечно, надо, только для императивного кода к этому прилагается еще обширная информация о временнОй сложности тех или иных алгоритмов.
PD>4. Попытка определить временнУю сложность этого несчастного кода, сделанная тобой и Mamut (ты привел численные данные, а он попробовал дать некоторое обоснование) вполне провалилась.

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

int v[] = { 1, 4, 5 };
std::shared_ptr<IEnumerable<int>> source(new Vector<int>(v, ARRAYSIZE(v)));

source->Aggregate(
    [](IEnumerable<int> *current, int value){
        if(current -> Count() == 0){
           int v1[] = {0};
           std::shared_ptr<IEnumerable<int>> source(new Vector<int>(v1, ARRAYSIZE(v1)));
           return source;
        } else {
           int v1[] = {value + current -> Last()};
           std::shared_ptr<IEnumerable<int>> source(new Vector<int>(v1, ARRAYSIZE(v1)));
           return current -> Concat(source);
        }
    }
);


Чистейший C++. Взято на основе тут. Код не обязательно 100% корректный, он здесь для определения уровня понимания.


dmitriid.comGitHubLinkedIn
Re[31]: ответ на вопрос: Почему новые программы работают меделнно
От: Mamut Швеция http://dmitriid.com
Дата: 29.06.12 10:02
Оценка:
PD>>>4. Попытка определить временнУю сложность этого несчастного кода, сделанная тобой и Mamut (ты привел численные данные, а он попробовал дать некоторое обоснование) вполне провалилась.
M>>Это звиздец. http://rsdn.ru/forum/flame.comp/4796524.1.aspx
Автор: MxMsk
Дата: 28.06.12

M>>Провалилась попытка у него. Нуну.

N>Ну да. Постфактум уже что-то объяснили — после того, как я нашёл, что именно надо объяснить.


Что и где ты нашел?

M>>Я же говорю, ты видишь ровно только то, что хочешь видеть.


N>Интересно, зачем ты откровенно врёшь тогда, когда тривиально можно поднять всю ветку и увидеть связи и последовательность?

N>Думаешь, что никто не захочет мараться об твою ложь?

Поднимай и видь что хочешь.


dmitriid.comGitHubLinkedIn
Re[24]: ответ на вопрос: Почему новые программы работают меделнно
От: Pavel Dvorkin Россия  
Дата: 29.06.12 10:03
Оценка: +1 -2
Здравствуйте, Sinclair, Вы писали:

У меня нет ни малейшего желания занииматься разбором твоей софистики. Ты прекрасно понимал, что речь там шла отнюдь не о случаях доступа через operator[],а о прямой индексации в стиле С, в противном случае мы имеем вызов функции operator[] внутри цикла, а это надо учитывать, если ее реализация не O(1). Равно как и все остальное. Суть выводов это никак не меняет.
With best regards
Pavel Dvorkin
Re[30]: ответ на вопрос: Почему новые программы работают меделнно
От: Pavel Dvorkin Россия  
Дата: 29.06.12 10:14
Оценка:
Здравствуйте, MxMsk, Вы писали:

PD>>4. Попытка определить временнУю сложность этого несчастного кода, сделанная тобой и Mamut (ты привел численные данные, а он попробовал дать некоторое обоснование) вполне провалилась.

MM>Я сразу утверждал, что код плох и объяснил, почему вменяемый разработчик не стал бы такое делать. На мой взгляд, одно это уже говорит, что оценка изначально плохого кода — дело неблагодарное. Но мы решили потратить время, ок. Да, я упустил из виду Concat, и что? Я не могу ошибаться? Ну, хорошо, я не имел право на ошибку (хотя, учитывая первое предложение, я бы не дал ей даже повода). Однако, Павел, ты разве требовал дать оценку? Не фига подобного. Изнальный вопрос был, какие правила. Теперь ты видишь, какие правила. Такие же, как и у императивного кода. Невнимание к Concat — это моя "студенческая" ошибка, не имеющая никакого отношения к теории.

Ну что же, все верно. Ошибку в укор тебе ставить не буду, конечно. Правда, тот факт, что ее никто не заметил , пока не было произведено сравнение с экспериментом, тоже кое о чем говорит...

В общем, могу согласиться, что какие-то правила, наверное, существуют. Плохо лишь то, что их толком сформулировать — получается плохо. Отсюда большой риск получить весьма (пусть не настолько, как в этом примере) неэффективный код. Если эти правила будут где-то внятно изложены, если любой учебник по LinQ будет их содержать, тогда, наверное, можно будет как-то иначе к этому относиться.

На этом свое участие в дискуссии заканчиваю.
With best regards
Pavel Dvorkin
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.