Re[6]: Об эффективности программ
От: Andy77 Ниоткуда  
Дата: 01.11.05 20:56
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Andy77, Вы писали:

S>Может, я чего не так понял?

S>второй проход получается, если:

S>- мы вызываем ToString несколько раз
S>- мы вызываем ToString не из того потока, в котором создавали стрингбилдер
S>- под стрингбилдер было выделено больше длины, чем фактически потребовалось.

S>В рассматриваемом случае ни одно из условий не выполняется.


Всё правильно, я протормозил, посыпаю голову пеплом
Re[39]: Об эффективности программ
От: jedi Мухосранск  
Дата: 01.11.05 22:55
Оценка: :)
Здравствуйте, Sinclair, Вы писали:


S>Я тебе показал то место, откуда можно взять сразу готовый объект строки без пересчета длины. Покажи мне теперь то место в винапи, где есть только char*, а длины нету. Не бойся — оно есть


Навскидку — LPTSTR GetCommandLine(void);
Re[3]: Об эффективности программ
От: IT Россия linq2db.com
Дата: 02.11.05 04:47
Оценка: :))
Здравствуйте, AndrewVK, Вы писали:

PD>>Почитайте весь тред, не пожалеете.


AVK>Если бы весь софт был на уровне Решарпера, у нас бы было значительно меньше проблем.


Ага. Как-нибудь я соберусь и выскажу всё что о нём думаю
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[9]: Параллельные билды для C++
От: Павел Кузнецов  
Дата: 02.11.05 05:53
Оценка:
Здравствуйте, VladD2, Вы писали:

GN>> Если совсем примитивно картину нарисовать — это будет работать, если исходник состоит из нескольких файлов. То есть, всё равно нужен какой-то (последовательный) механизм который будет выделять эти "параллельные" части.


VD> Современные программы состоят из кучи (обычно сотни, а то и тысячи) едениц компиляции (читай файлов). В грамотно спроектированных языках такие еденицы содержат довльно независимые еденицы программы, например, классы. Распараллелить их парсинг не проблема. Прочто создаем такое количество экземпляров парсеров сколько есть физический ядер процессора и в перед...


VD> Возможно с этим будут проблемы в С++, но меня в последнее время его проблемы больше не волнуют.


Очевидно, в C++ с этим никаких проблем не будет, т.к. язык изначально предназначен для раздельной компиляции. Компилятор VC++ умеет компилировать несколько файлов параллельно (например, недокументированная опция командной строки /MP2). В VS.Net 2003 этот режим был ограничен вариантами, где был не нужен доступ к *.pdb (т.е. по большей части варианты теоретические), в VS.Net 2005 это ограничение снято. Также есть режим параллельных билдов для vcbuild и devenv. GCC умеет билдить распределенно по машинам. Для VC++ есть сторонние утилиты, делающие более-менее то же самое.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[47]: Об эффективности программ
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.11.05 06:16
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Как интересно! А откуда у тебя 4000 взялось, если не секрет?

Ниоткуда. Я мог бы усложнить пример и перевыделять буфер удвоением, получая амортизированную производительность порядка log(lineLength). В данном случае я закладываюсь на то, что строка не будет длиннее 4000.
PD>Допустить, что длина строки может быть больше, чем 4000, нельзя ? А если я тебе специально файл из одной текстовой строки сгенерирую длиной в 10 Кбайт, тогда как ?
я всего лишь прочитаю первые 4000 символов, и смогу корректно определить эту ситуацию за О(1).
PD>Но не это главное. Это все так, мелочи. Не мелочи другое — эта длина тут вычисляется внутри fgets.
Нет. Павел, fgets не вычисляет ничего. Да, она работает при помощи банального сканирования.
PD>Потому как найти длину строки в текстовом файле (вообще не говоря о программных средствах) нельзя кроме как, встав в некое смещение в этом файле, просматривать символы (байты) один за другим в поисках 0D. Нет другого способа. И кто-то это делать будет. Хоть gets, хоть ReadConsole, хоть какой-то метод из .Net 9а реально, конечно, нативный метод).
Павел, какое это отношение имеет к теме дискуссии? Даже если бы fgets знала длину строки заранее, это никак бы не ускорило копирование в буфер. Ты тут недавно утверждал, что для получения длины строки, возвращенной fgets, нужны дополнительные расходы. Это — неправда!

PD>Синклер, это же задача на структуры данных. Тут дело даже не в файле вообще. При такой структуре данных нет иного способа разделить элементы, кроме как тупо побайтно проходить в поисках терминатора ? Неужели это тебе надо объяснять ? Хоть какте средства здесь используй — нет.

При чем здесь структура данных?

PD>Насчет потери информации — ИМХо в данном случае чистая казуистика.

PD>Насчет примера — я тебе только что пример с текстовыми файлами привел.
Твой пример, увы, ничего не доказывает. Он доказывает только одно — человек с мышлением, испорченным C, не будет искать способ эффективного вычисления длины при получении данных. Он лучше воспользуется небезопасным способом, типа strcat, для которого длину вычислять не надо.
PD>Могу и другие примеры привести, подумать надо. Навскидку — LoadString. Можешь посмотреть, как в MFC CString они ее определяют, тихий ужас, потрассируй. Идиотизм, кстати, чистейшей воды. Не знаю даже, что студентам на этот счет говорить — для WinAPI.
PD>Синклер, не надо сто раз про консоль. Не аргумент это. я тебе уже и другие примеры привел.
Ок, пока что у нас один открытый пример — LoadString. Все остальные магическим способом оказались заблуждениями. Здорово, правда?

PD>Вот с этим вполне согласен. То. что этот интерфейс был создан, когда про ООП и не говорили — верно. То, что можно интерфейс, где строки нулем не терминируются, придумать — верно (да и зачем придумывать, см. string из pascal и C#). Более того, на тему о том, что эффективнее (ну не могу я без этого тоже готов спорить. Но притягивать за уши длину там где ее нет — честное слово, не стоит. А с винапи ситуация такова -ее в общем-то нет, по крайней мере очень часто. И чем ьебя это задевает — не понимаю. Скажи просто — интерфейс старый, ИМХО дурацкий, мне не по вкусу, я считаю, что лучше, если бы строки всегда с длиной были — да я с тобой сразу соглашусь и твое мнение вполне приму (хотя лично и не разделяю его). А ты зачем-то взялся доказывать. что в этом старом дурацком интерфейсе прямо таки везде заложены идеи а ля 2000 год. Ни к чему это, ей-богу.


PD>А файл все же остается

В смысле? Какой файл?
PD>>>И как следствие из этого — еще один вопрос
PD>Вот с этим тоже соглашусь. С твоей точки зрения неправильно. ИМХО. С моей — иначе ? Имеет моя точка зрения право на существование ?

PD>>>Хм, а ведь в том примере, с которого весь сыр-бор разгорелся (с sprintf) я же битый час доказывал, что у меня есть эта самая точная верхняя граница.

S>>Это какая? У тебя не было никакой верхней границы. У тебя была наивная вера в существование верхней границы. А когда я говорю про точную верную границу, я говорю вот про что:

S>>Допустим, мы воспользовались функцией fgets:


S>>

PD><skipped>

S>>


S>>Итак, здесь мы имеем точную верхнюю границу для суммы всех длин: она равна, очевидно, 168. Мы можем спокойно использовать для конкатенации буфер этого размера. Не потому, что где-то в БД (внешней по отношению к нашей программе!) есть размер поля, и не потому, что оператор поклялся не засыпать на пробеле, а потому, что выполняются некоторые инварианты. Функция fgets так удачно написана.


PD>Ну ей богу, несерьезно. Если у тебя из fgets эта длина определена как не более 168 — можно. Если валидатор на форме мне проверил строки (а ему сказано более 100 не принимать) — у меня наивная вера.

Ключевое слово — инкапсуляция. Здесь информация хранится и используется в одном и том же месте. А у тебя реализация одного участка программы катастрофическим образом зависит от другого участка программы.

PD>


PD>Но ты опять кусок из моего постинга выкинул. Придется мне его вновь привести


PD>Ну а что касается того, что тебе char* не нравится — отвечу твоими же словами насчет списка и массива. Где нужен список, а где массив. Где лучше иметь строку с длиной, а где — без длины. Только вот одно "но" при этом имеется. Из строки char* сделать строку с длиной мне никаких проблем не составит, даже на чистом С. Так что можешь сразу считать, что строка с длиной у меня всегда потенциально есть, и если реально понадобится — всегда будет. А вот как для объекта "строка с длиной" в том же Шарпе от длины избавиться ? . Конечно, средствами Шарпа имитировать строку с нулем несложно, только вот интерфейс для этого типа, боюсь, придется писать самому.


PD>Прокомментируй все же это , пожалуйста.

А что тут комментировать? Добавить длину к ASCIIZ стоит O(N). Убрать длину — O(0). Кто там заботился об эффективности?
PD>Я понимаю, что тебе мои заботы об эффективности надоели. Но все же представь — десятки миллионов строк в ОП хранить надо. Средняя длина — 10 байт. На поле длины — 4 байта. Итого 40% уходит на накладные расходы. Так что придется сокращать размер текстовой выборки. а длины и не нужны, а если нужны — их что, получить сложно ? В любой момент strcpy к твоим услугам. Да, на это время уйдет, но пусть оптимизировать надо по памяти, а не по времени. Вот тут я эти 40% и отыграю.
При средней длине в 10 байт можно свести длину к байту, и получить 10%. Оп-ля, мы только что сэкономили 30%, не снизив безопасность.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[48]: Об эффективности программ
От: Pavel Dvorkin Россия  
Дата: 02.11.05 08:04
Оценка: :)
Здравствуйте, Sinclair, Вы писали:

Все, извини, но это письмо будет точно последним. Времени больше на эти дискуссии нет — увы, заказчик прислал наконец спецификации проекта, и он именно на С# .
Могу сделать тебе относительный комплимент — дискутировать ты умеешь. К сожалению, вынужден также отметить и твои , увы, не совсем корректные способы дискуссии типа ухода от вопросов, которые тебе не нравятся или подмену сути вопроса. Я это заметил не сразу.
Впрочем, это не так уж важно — все равно вся эта дискуссия ни к чему. В конце концов чего мы ей добиваемся на потеху всей публике ? Доказать друг другу мы ничего не сможем, это давно ясно. Еще один набор аргументов с моей или твоей стороны — ничего не изменит. Так что я заканчиваю.
With best regards
Pavel Dvorkin
Re[14]: Об эффективности программ
От: Hydrogen  
Дата: 02.11.05 08:24
Оценка: +1
Здравствуйте, GlebZ, Вы писали:

//оптимально по производительности
int cnt=GetCount();
....
for(int i=0;i<cnt;i++){...}
....
for(int j=0;j<cnt;j++){...}

//оптимально по дизайну
for(int i=0;i<GetCount();i++){....}
.......
for (int j=0;j<GetCount();j++){....}


А если так:

for(int i=0, cnt=GetCount();i<cnt;i++){....}
.......
for (int j=0, cnt=GetCount();j<сnt;j++){....}

... << RSDN@Home 1.1.3 stable >>
Re[15]: Об эффективности программ
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 02.11.05 08:36
Оценка: +1 :)
Здравствуйте, Hydrogen, Вы писали:

H>А если так:

H>for(int i=0, cnt=GetCount();i<cnt;i++){....}
H>.......
H>for (int j=0, cnt=GetCount();j<сnt;j++){....}

H>

Не, реальные пацаны пишут
for(int i=0, cnt=GetCount();i<cnt;++i){....}

-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[14]: Об эффективности программ
От: OnThink Россия http://vassilsanych.livejournal.com
Дата: 02.11.05 09:04
Оценка: :)
GZ>
GZ>//оптимально по дизайну
GZ>for(int i=0;i<GetCount();i++){....}
GZ>.......
GZ>for (int j=0;j<GetCount();j++){....}
GZ>


не оптимально. Дублирование кода
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[16]: Об эффективности программ
От: GlebZ Россия  
Дата: 02.11.05 09:24
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Не, реальные пацаны пишут

КД>
КД>for(int i=0, cnt=GetCount();i<cnt;++i){....}
КД>

КД>
Ну и че? Ну добавили суррогат. Усложнили читабельность кода.
А вы уверены что компилятор не догадается вынести проверку выхода из цикла?

Первое правило рефакторинга. Делай все как можно проще, и сложность сама придет.

С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[17]: Об эффективности программ
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 02.11.05 09:38
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, Коваленко Дмитрий, Вы писали:


Не, реальные пацаны пишут
КД>>for(int i=0, cnt=GetCount();i<cnt;++i){....}

КД>>
GZ>Ну и че? Ну добавили суррогат. Усложнили читабельность кода.

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

GZ>Первое правило рефакторинга. Делай все как можно проще, и сложность сама придет.


Сдается мне, у нас разные представления о сложности
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[10]: Параллельные билды для C++
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.11.05 15:34
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Очевидно, в C++ с этим никаких проблем не будет, т.к. язык изначально предназначен для раздельной компиляции. Компилятор VC++ умеет компилировать несколько файлов параллельно (например, недокументированная опция командной строки /MP2). В VS.Net 2003 этот режим был ограничен вариантами, где был не нужен доступ к *.pdb (т.е. по большей части варианты теоретические), в VS.Net 2005 это ограничение снято. Также есть режим параллельных билдов для vcbuild и devenv. GCC умеет билдить распределенно по машинам. Для VC++ есть сторонние утилиты, делающие более-менее то же самое.


Теоритически да. Но практически при компиляции очень много времени уходит на компиляцию прекомпилируемых заголовков. А они как я понимаю компилируются последовательно. Гинковка опять таки становится узким местом. Хотя конечно для С++ параллельная компиляция актуальна куда сильнее. Даже с ней скорость компиляции очень удручающая. У меня знакомый народ использует какую-то хрень для распределения компиляции на несколько машин в офисе. И то жалуются.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Закон Мура умер
От: OnThink Россия http://vassilsanych.livejournal.com
Дата: 03.11.05 13:35
Оценка: +1 :)
GN>Mac может и хороший комп, но для себя не вижу никакого смысла в нём... разве что для понтов .

Ну почему. Руки греть зимой хорошо.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Об эффективности программ
От: vitaly_spb Россия  
Дата: 03.11.05 16:52
Оценка:
MS>это все равно O(1)

а Павел-то за о маленькое борется
...Ei incumbit probatio, qui dicit, non qui negat...
Re[15]: Об эффективности программ
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.11.05 21:47
Оценка:
Здравствуйте, OnThink, Вы писали:

GZ>>
GZ>>//оптимально по дизайну
GZ>>for(int i=0;i<GetCount();i++){....}
GZ>>.......
GZ>>for (int j=0;j<GetCount();j++){....}
GZ>>


OT>не оптимально. Дублирование кода


А это результат оптимизации — ручное раскрытие цикла.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Об эффективности программ
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.11.05 00:01
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Надо сказать, что API для Вордовской системы проверки правописания

C>свободно доступны. У меня, например, они прикручены к Far'у.

Насколько мне известно. Доступно только старое АПИ. Можно ссылочку?
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Об эффективности программ
От: Cyberax Марс  
Дата: 04.11.05 07:15
Оценка:
VladD2 wrote:

> C>Надо сказать, что API для Вордовской системы проверки правописания

> C>свободно доступны. У меня, например, они прикручены к Far'у.
> Насколько мне известно. Доступно только старое АПИ. Можно ссылочку?

У меня стоит http://plugring.farmanager.com/downld/files/gspell.1.05.rar
— вроде работает. Как именно — разбираться не очень хочется.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[5]: Об эффективности программ
От: Alexey Axyonov Украина  
Дата: 04.11.05 07:48
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>- вроде работает. Как именно — разбираться не очень хочется.


Кстати плагин — 2001 года. Так что Влад прав.

C>--

C>С уважением,
C> Alex Besogonov (alexy@izh.com)
... << RSDN@Home 1.2.0 alpha rev. 619>>
Re[5]: Об эффективности программ
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.11.05 12:53
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>У меня стоит http://plugring.farmanager.com/downld/files/gspell.1.05.rar

C>- вроде работает. Как именно — разбираться не очень хочется.

Это старый АПИ. Оно не будет работать на машинах с новым вордом. По крайней мере на моей машине где стоит Word 2003 оно не работает.

Причем обертка написана так криво, что в случае неудачи она просто не подает никаких знаков.

В общем, зря убил 2 часа на разбирательснво с этим делом.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Параллельные билды для C++
От: IT Россия linq2db.com
Дата: 05.11.05 03:28
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>У меня знакомый народ использует какую-то хрень для распределения компиляции на несколько машин в офисе. И то жалуются.


А что они такое пишут? Индусы что-ли?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.