Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Andy77, Вы писали: S>Может, я чего не так понял?
S>второй проход получается, если: S>- мы вызываем ToString несколько раз S>- мы вызываем ToString не из того потока, в котором создавали стрингбилдер S>- под стрингбилдер было выделено больше длины, чем фактически потребовалось.
S>В рассматриваемом случае ни одно из условий не выполняется.
Всё правильно, я протормозил, посыпаю голову пеплом
S>Я тебе показал то место, откуда можно взять сразу готовый объект строки без пересчета длины. Покажи мне теперь то место в винапи, где есть только char*, а длины нету. Не бойся — оно есть
Здравствуйте, AndrewVK, Вы писали:
PD>>Почитайте весь тред, не пожалеете.
AVK>Если бы весь софт был на уровне Решарпера, у нас бы было значительно меньше проблем.
Ага. Как-нибудь я соберусь и выскажу всё что о нём думаю
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, VladD2, Вы писали:
GN>> Если совсем примитивно картину нарисовать — это будет работать, если исходник состоит из нескольких файлов. То есть, всё равно нужен какой-то (последовательный) механизм который будет выделять эти "параллельные" части.
VD> Современные программы состоят из кучи (обычно сотни, а то и тысячи) едениц компиляции (читай файлов). В грамотно спроектированных языках такие еденицы содержат довльно независимые еденицы программы, например, классы. Распараллелить их парсинг не проблема. Прочто создаем такое количество экземпляров парсеров сколько есть физический ядер процессора и в перед...
VD> Возможно с этим будут проблемы в С++, но меня в последнее время его проблемы больше не волнуют.
Очевидно, в C++ с этим никаких проблем не будет, т.к. язык изначально предназначен для раздельной компиляции. Компилятор VC++ умеет компилировать несколько файлов параллельно (например, недокументированная опция командной строки /MP2). В VS.Net 2003 этот режим был ограничен вариантами, где был не нужен доступ к *.pdb (т.е. по большей части варианты теоретические), в VS.Net 2005 это ограничение снято. Также есть режим параллельных билдов для vcbuild и devenv. GCC умеет билдить распределенно по машинам. Для VC++ есть сторонние утилиты, делающие более-менее то же самое.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, 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
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Все, извини, но это письмо будет точно последним. Времени больше на эти дискуссии нет — увы, заказчик прислал наконец спецификации проекта, и он именно на С# .
Могу сделать тебе относительный комплимент — дискутировать ты умеешь. К сожалению, вынужден также отметить и твои , увы, не совсем корректные способы дискуссии типа ухода от вопросов, которые тебе не нравятся или подмену сути вопроса. Я это заметил не сразу.
Впрочем, это не так уж важно — все равно вся эта дискуссия ни к чему. В конце концов чего мы ей добиваемся на потеху всей публике ? Доказать друг другу мы ничего не сможем, это давно ясно. Еще один набор аргументов с моей или твоей стороны — ничего не изменит. Так что я заканчиваю.
//оптимально по производительности
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++){....}
Здравствуйте, GlebZ, Вы писали:
GZ>Здравствуйте, Коваленко Дмитрий, Вы писали:
Не, реальные пацаны пишут
КД>>for(int i=0, cnt=GetCount();i<cnt;++i){....}
КД>> GZ>Ну и че? Ну добавили суррогат. Усложнили читабельность кода.
Не, это называется "устранение преждевременной пессимизации" относительного того, что число элементов якобы может поменяться во время работы цикла. А компилятор, это такое существо, "полаганием" на которое лучше не злоупотреблять
GZ>Первое правило рефакторинга. Делай все как можно проще, и сложность сама придет.
Сдается мне, у нас разные представления о сложности
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Очевидно, в C++ с этим никаких проблем не будет, т.к. язык изначально предназначен для раздельной компиляции. Компилятор VC++ умеет компилировать несколько файлов параллельно (например, недокументированная опция командной строки /MP2). В VS.Net 2003 этот режим был ограничен вариантами, где был не нужен доступ к *.pdb (т.е. по большей части варианты теоретические), в VS.Net 2005 это ограничение снято. Также есть режим параллельных билдов для vcbuild и devenv. GCC умеет билдить распределенно по машинам. Для VC++ есть сторонние утилиты, делающие более-менее то же самое.
Теоритически да. Но практически при компиляции очень много времени уходит на компиляцию прекомпилируемых заголовков. А они как я понимаю компилируются последовательно. Гинковка опять таки становится узким местом. Хотя конечно для С++ параллельная компиляция актуальна куда сильнее. Даже с ней скорость компиляции очень удручающая. У меня знакомый народ использует какую-то хрень для распределения компиляции на несколько машин в офисе. И то жалуются.
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Cyberax, Вы писали:
C>Надо сказать, что API для Вордовской системы проверки правописания C>свободно доступны. У меня, например, они прикручены к Far'у.
Насколько мне известно. Доступно только старое АПИ. Можно ссылочку?
... << RSDN@Home 1.2.0 alpha rev. 618>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VladD2 wrote:
> C>Надо сказать, что API для Вордовской системы проверки правописания > C>свободно доступны. У меня, например, они прикручены к Far'у. > Насколько мне известно. Доступно только старое АПИ. Можно ссылочку?
Здравствуйте, VladD2, Вы писали:
VD>У меня знакомый народ использует какую-то хрень для распределения компиляции на несколько машин в офисе. И то жалуются.
А что они такое пишут? Индусы что-ли?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.