Очередной ратный подвиг индусокодеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.01.07 03:33
Оценка: 2 (2) +2 :))) :))) :))) :))
На этот раз подвиг работников Microsoft:
private string FormatMessage(string message)
{
    if (string.IsNullOrEmpty(message))
        return Environment.NewLine;

    StringBuilder sb = new StringBuilder(message.Length + Environment.NewLine.Length);

    sb.AppendLine(message);
    return sb.ToString();
}

А какая оптимизация!? Ведь буфер до байта рассчитали, чтобы конец строки вместить!

Для тех кто читает с просони поясню, что сей шедевр можно записать так:
private string FormatMessage(string message)
{
    return message + Environment.NewLine;
}

Причем получится не только читабельнее, но и чуточку быстрее, так как сложение преобразуется в вызов string.Concat(string, string), что быстрее чем создание и использование StringBuilder-а.

Второй пример, на этот раз архитектурного таланта тех же авторов можно поглядеть здесь:
Где в МС бурут таких баранов?
Автор: VladD2
Дата: 17.01.07
(и ниже по ветке).
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Очередной ратный подвиг индусокодеров
От: Sheridan Россия  
Дата: 17.01.07 06:33
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>На этот раз подвиг работников Microsoft:


Угу, а потом рассказывают мне все что винда оптимизированна
Matrix has you...
Re: Очередной ратный подвиг индусокодеров
От: Karamat Беларусь  
Дата: 17.01.07 06:34
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>На этот раз подвиг работников Microsoft:


Я с просони — откуда этот код?
Re[2]: Очередной ратный подвиг индусокодеров
От: Igor Sukhov  
Дата: 17.01.07 06:40
Оценка:
Здравствуйте, Sheridan, Вы писали:

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


VD>>На этот раз подвиг работников Microsoft:


S>Угу, а потом рассказывают мне все что винда оптимизированна


А что это по твоему, как не оптимизиция ?
* thriving in a production environment *
Re[2]: Очередной ратный подвиг индусокодеров
От: Splean Россия  
Дата: 17.01.07 06:56
Оценка:
Здравствуйте, Karamat, Вы писали:

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


VD>>На этот раз подвиг работников Microsoft:


K>Я с просони — откуда этот код?


MSDN как я понял
Может я тоже спросони
icq : 997788
Re: Очередной ратный подвиг индусокодеров
От: e-Xecutor Россия  
Дата: 17.01.07 08:01
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>На этот раз подвиг работников Microsoft:

VD>
VD>private string FormatMessage(string message)
VD>{
VD>    if (string.IsNullOrEmpty(message))
VD>        return Environment.NewLine;

VD>    StringBuilder sb = new StringBuilder(message.Length + Environment.NewLine.Length);

VD>    sb.AppendLine(message);
VD>    return sb.ToString();
VD>}
VD>

VD>А какая оптимизация!? Ведь буфер до байта рассчитали, чтобы конец строки вместить!

VD>Для тех кто читает с просони поясню, что сей шедевр можно записать так:

VD>
VD>private string FormatMessage(string message)
VD>{
VD>    return message + Environment.NewLine;
VD>}
VD>

VD>Причем получится не только читабельнее, но и чуточку быстрее, так как сложение преобразуется в вызов string.Concat(string, string), что быстрее чем создание и использование StringBuilder-а.

Вообще-то семантика разная
Если строка не пустая, то в 1-м варианте возвращается просто принятая строка без изменений.

Или ты забыл добавить в оригинальном примере
sb.AppendLine(Environment.NewLine);
Re[2]: Очередной ратный подвиг индусокодеров
От: Трофимов  
Дата: 17.01.07 08:51
Оценка: +1
А что у нас делает AppendLine?
Re[2]: Очередной ратный подвиг индусокодеров
От: Oyster Украина https://github.com/devoyster
Дата: 17.01.07 09:53
Оценка: +1
Здравствуйте, e-Xecutor, Вы писали:

EX>Вообще-то семантика разная

EX>Если строка не пустая, то в 1-м варианте возвращается просто принятая строка без изменений.

Неа. Потому что StringBuilder.Append() и StringBuilder.AppendLine() — не одно и то же (второй метод автоматически добавляет перевод строки в конце).
Re[3]: Очередной ратный подвиг индусокодеров
От: PhantomIvan  
Дата: 17.01.07 11:18
Оценка:
VD>>>На этот раз подвиг работников Microsoft:

K>>Я с просони — откуда этот код?


S>MSDN как я понял

S>Может я тоже спросони

это код из Visual Studio SDK
("C:\Program Files\Visual Studio 2005 SDK\2006.12\VisualStudioIntegration\Common\Source\CSharp\Project\idebuildlogger.cs")
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Очередной ратный подвиг индусокодеров
От: sc Россия  
Дата: 17.01.07 11:59
Оценка: +1 :))) :))) :))
Здравствуйте, PhantomIvan, Вы писали:

VD>>>>На этот раз подвиг работников Microsoft:


K>>>Я с просони — откуда этот код?


S>>MSDN как я понял

S>>Может я тоже спросони

PI>это код из Visual Studio SDK

PI>("C:\Program Files\Visual Studio 2005 SDK\2006.12\VisualStudioIntegration\Common\Source\CSharp\Project\idebuildlogger.cs")
так по названию файла видно)
Re[2]: Очередной ратный подвиг индусокодеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.01.07 15:47
Оценка:
Здравствуйте, Karamat, Вы писали:

VD>>На этот раз подвиг работников Microsoft:


K>Я с просони — откуда этот код?


MPF — Managed Package Framework (управляемые обертки над API Visual Studio 2005).
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Очередной ратный подвиг индусокодеров
От: IvanDunaev  
Дата: 17.01.07 16:08
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>На этот раз подвиг работников Microsoft:

VD>
VD>private string FormatMessage(string message)
VD>{
VD>    if (string.IsNullOrEmpty(message))
VD>        return Environment.NewLine;

VD>    StringBuilder sb = new StringBuilder(message.Length + Environment.NewLine.Length);

VD>    sb.AppendLine(message);
VD>    return sb.ToString();
VD>}
VD>


человек, судя по всему, не знал, как определено сложение с null-строкой (а это действительно не очевидно), и вместо экспериментов/поисков за 15 секунд написал безопасный код, работающий для любого случая.
Re[2]: Очередной ратный подвиг индусокодеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.01.07 16:57
Оценка: 1 (1) +2 -1
Здравствуйте, IvanDunaev, Вы писали:

ID>человек, судя по всему, не знал, как определено сложение с null-строкой (а это действительно не очевидно), и вместо экспериментов/поисков за 15 секунд написал безопасный код, работающий для любого случая.


Ага. Человек еще незнал, что полным маразмом является использовать StringBuilder для конкатинации двух строк. Зато человек знал инструкцию по которой для генерации строкнадо использовать StringBuilder. Головой своей человек явно пользоваться не приучен (с рождения), по-этому он взял и тупо выполнил инструкцию.

Если проблема была бы только с null, то он мог бы хотя бы не использовать StringBuilder.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Очередной ратный подвиг индусокодеров
От: Lepsik Индия figvam.ca
Дата: 17.01.07 20:23
Оценка: :)
Я думаю ты просто не понимаешь как работает эта функция, к тому же в ряде случаев оригинал работает гораздо быстрее твоего кода
Re[2]: Очередной ратный подвиг индусокодеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.01.07 20:49
Оценка: :)))
Здравствуйте, Lepsik, Вы писали:

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


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

Ну, и про то что я не понимаю тоже очень любопытно. (надо же опыта набираться)

А то может я зря идусятника обидел? Вот конфиз то будет.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Очередной ратный подвиг индусокодеров
От: Demon Россия  
Дата: 18.01.07 06:15
Оценка: 2 (1)
Здравствуйте, VladD2, Вы писали:

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


VD>Приятно встретить настоящего эксперта по дотнету! Поделись опытом с начинающим, расскажи в каких именно случаях "оригинал работает гораздо быстрее"?


В дебаге при пустой и при null строках:
FormatMessage1( <null> ) : 265ms
FormatMessage2( <null> ) : 281ms

FormatMessage1( "" ) : 297ms
FormatMessage2( "" ) : 313ms

FormatMessage1( "qwre" ) : 3000ms
FormatMessage2( "qwre" ) : 1156ms

10млн итераций.

Замечу, именно в дебаге, в релизе второй вариант быстрее.
Только не надо кидать в меня палками, я просто замерял время и подкинул повод для размышления.
Re[4]: Очередной ратный подвиг индусокодеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.01.07 10:34
Оценка:
Здравствуйте, Demon, Вы писали:

D>Замечу, именно в дебаге, в релизе второй вариант быстрее.


Предлагаешь развить тему в сторону юмористического тестировани?
Тогда приводи исходники тестов. Но предварительно, на всякий пожарный, очень советую прочесть раздел "Тесты" из статьи Как не надо писать статьи
Автор(ы): Михаил Купаев (Kupaev)
Дата: 14.03.2005
Поиск в Google по словам "как писать статьи" выдает 664 страницы. Статьи с таким названием писали столь уважаемые люди, как Г.А. Шенгели, А.А.Шалыто и др. Но в целом, 664 страницы — это, конечно, перебор. Понятно, что большая часть этого моря писанины сочинена людьми, писать статьи не умеющими. Если бы они умели писать статьи, они их писали бы, а не учили других. Признаюсь честно – я не знаю, как надо писать статьи. Зато за время своего редакторства я насмотрелся на такое количество уродцев, которого хватило бы на пару питерских Кунсткамер, и еще осталось бы на несколько курортных выставок. Поэтому я достаточно хорошо представляю себе, чего при этом делать не нужно. Вот об этом-то я и попытаюсь рассказать...
.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Очередной ратный подвиг индусокодеров
От: Demon Россия  
Дата: 18.01.07 11:14
Оценка:
Здравствуйте, VladD2, Вы писали:

D>>Замечу, именно в дебаге, в релизе второй вариант быстрее.


VD>Предлагаешь развить тему в сторону юмористического тестировани?

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

VD>Тогда приводи исходники тестов. Но предварительно, на всякий пожарный, очень советую прочесть раздел "Тесты" из статьи Как не надо писать статьи
Автор(ы): Михаил Купаев (Kupaev)
Дата: 14.03.2005
Поиск в Google по словам "как писать статьи" выдает 664 страницы. Статьи с таким названием писали столь уважаемые люди, как Г.А. Шенгели, А.А.Шалыто и др. Но в целом, 664 страницы — это, конечно, перебор. Понятно, что большая часть этого моря писанины сочинена людьми, писать статьи не умеющими. Если бы они умели писать статьи, они их писали бы, а не учили других. Признаюсь честно – я не знаю, как надо писать статьи. Зато за время своего редакторства я насмотрелся на такое количество уродцев, которого хватило бы на пару питерских Кунсткамер, и еще осталось бы на несколько курортных выставок. Поэтому я достаточно хорошо представляю себе, чего при этом делать не нужно. Вот об этом-то я и попытаюсь рассказать...
.


Вот. Функции FormatMessage1 и FormatMessage2 точь в точь изначальные.
int amount = 10 * 1000 * 1000;
string[] ss = new string[] { null, "", "qwre" };

foreach ( string s in ss )
{
    int t1 = System.Environment.TickCount;
    for ( int i = 0; i < amount; i++ )
    {
        FormatMessage1( s );
    }
    int dt1 = System.Environment.TickCount - t1;
    System.Console.WriteLine( "FormatMessage1( {0} ) : {1}ms", 
        s == null ? "<null>" : ("\"" + s + "\""), dt1 );


    int t2 = System.Environment.TickCount;
    for ( int i = 0; i < amount; i++ )
    {
        FormatMessage2( s );
    }
    int dt2 = System.Environment.TickCount - t2;
    System.Console.WriteLine( "FormatMessage2( {0} ) : {1}ms", 
        s == null ? "<null>" : ("\"" + s + "\""), dt2 );

    System.Console.WriteLine();
}


(в сторону): Сейчас начнутся указания, типа "а надо было перегружаться между тестами", "надо было GC запускать".

Кстати, в статье, первые два абзаца раздела "Тесты" какие-то бредовые.
"... если вы тестируете скорость ... проверку результатов лучше выполнять ...". Зачем связали тестирование на корректность и на скорость?
Re[3]: Очередной ратный подвиг индусокодеров
От: Vi2 Удмуртия http://www.adem.ru
Дата: 18.01.07 11:27
Оценка:
Здравствуйте, Igor Sukhov, Вы писали:

IS>А что это по твоему, как не оптимизиция ?


Это "пища" для оптимизирующего компилятора. Иначе же зачем он нужен?!
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Очередной ратный подвиг индусокодеров
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 18.01.07 12:15
Оценка:
Здравствуйте, Lepsik, Вы писали:

L> к тому же в ряде случаев оригинал работает гораздо быстрее твоего кода


Интересно, как часто вызывается данная функция? Будет ли программа, вызывающая её, работать гораздо быстрее в целом, если мы выиграем пару тактов процессора?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Очередной ратный подвиг индусокодеров
От: Igor Sukhov  
Дата: 18.01.07 15:59
Оценка: +1 :)
Здравствуйте, Vi2, Вы писали:

IS>>А что это по твоему, как не оптимизиция ?

Vi2>Это "пища" для оптимизирующего компилятора. Иначе же зачем он нужен?!

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

То есть когда DEV пишет код с использованием StringBuilder-a, он не только явно показывает другим
DEV что этот код оптимален потому что он сбацан из набора Best Practices, поднимая в общем-то общую
культуру кодирования в компании, но и подсказывает компилятору в каком именно месте провести агрессивную
оптимизацию? Хитро.
... << RSDN@Home 1.2.0 alpha rev. 0>>
* thriving in a production environment *
Re[3]: Очередной ратный подвиг индусокодеров
От: IvanDunaev  
Дата: 18.01.07 16:17
Оценка: 1 (1) +1
Здравствуйте, VladD2, Вы писали:

VD>Ага. Человек еще незнал, что полным маразмом является использовать StringBuilder для конкатинации двух строк.


а для чего использовать StringBuilder как не для конкатенации?

VD>Зато человек знал инструкцию по которой для генерации строкнадо использовать StringBuilder. Головой своей человек явно пользоваться не приучен (с рождения), по-этому он взял и тупо выполнил инструкцию.


в командной разработке это и к лучшему.

в целом напоминает претензии кустаря, делающего резные расписные табуретки, к стулу, сделанном на станке.
Re[4]: Очередной ратный подвиг индусокодеров
От: master_of_shadows Беларусь  
Дата: 18.01.07 16:48
Оценка: +1
Здравствуйте, IvanDunaev, Вы писали:

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


VD>>Ага. Человек еще незнал, что полным маразмом является использовать StringBuilder для конкатинации двух строк.


ID>а для чего использовать StringBuilder как не для конкатенации?


Ну для конкатенации двух строк вполне достаточно:

return string1 + string2;


А StringBuilder подойдёт для чего нибудь более сложного:

StringBuilder s = new StringBuilder(list.Lenght * 50 + 50);
foreach (Item item in list) {
    s.AppendFormat("...{0}...", item.ToString()/* размер примерно равен 40-50 */);
}
s.Append("Добавим ещё чего нить");
return s.ToString();
Re[5]: Очередной ратный подвиг индусокодеров
От: IvanDunaev  
Дата: 18.01.07 17:03
Оценка: :))
Здравствуйте, master_of_shadows, Вы писали:

__>Ну для конкатенации двух строк вполне достаточно:


__>
__>return string1 + string2;
__>


__>А StringBuilder подойдёт для чего нибудь более сложного:


__>
__>StringBuilder s = new StringBuilder(list.Lenght * 50 + 50);
__>foreach (Item item in list) {
__>    s.AppendFormat("...{0}...", item.ToString()/* размер примерно равен 40-50 */);
__>}
__>s.Append("Добавим ещё чего нить");
__>return s.ToString();
__>


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

речь идет о "засушивании" кода, когда единообразие и формальность подхода превалируют над частностями, позволяющими выиграть пару строк / тактов. конечно, данный конктретный случай слишком гиперболистичен, чтобы служить типичным примером.
Re[3]: Очередной ратный подвиг индусокодеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.01.07 18:19
Оценка:
Здравствуйте, konsoletyper, Вы писали:

K>Интересно, как часто вызывается данная функция? Будет ли программа, вызывающая её, работать гораздо быстрее в целом, если мы выиграем пару тактов процессора?


По меркам компьютера — раз в 10 лет. Она вызывается при выводе сообщений об ошибках в окно Output. Так что рассуждать о производительности тут просто смешно. Но дело ведь не в этом. Лично мне интересен полет фантазии товарища написавшего подобное.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Очередной ратный подвиг индусокодеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.01.07 18:19
Оценка: +1 -1
Здравствуйте, IvanDunaev, Вы писали:

ID>а для чего использовать StringBuilder как не для конкатенации?


Для генерации строк из заранее неизвестного количества подстрок или значений (преобразумых в строки).
Если стоит задача сложить Х строк, то стринг-билдер тут оверкил. Это грамоздко и бессмысленно. Конечно в большинстве случаев разницу будет в микроскоп не увидить, но дело даже не в скорости.

VD>>Зато человек знал инструкцию по которой для генерации строкнадо использовать StringBuilder. Головой своей человек явно пользоваться не приучен (с рождения), по-этому он взял и тупо выполнил инструкцию.


ID>в командной разработке это и к лучшему.


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

ID>в целом напоминает претензии кустаря, делающего резные расписные табуретки, к стулу, сделанном на станке.


Нда. Во истину индус — это не национальность. Это образ мышления.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Очередной ратный подвиг индусокодеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.01.07 18:19
Оценка:
Здравствуйте, Demon, Вы писали:

D>(в сторону): Сейчас начнутся указания, типа "а надо было перегружаться между тестами", "надо было GC запускать".


Зачем? Я бы просто посоветовал "включить" голову и подумать над тем, что ты измерял.

Первые два варианта не приводят к использованию StringGuilder-а, так как срабатывает проверка:
if (string.IsNullOrEmpty(message))
    return Environment.NewLine;

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

Ну, да добавь эти строки во второй варинат и разница мужду ними исчезнет. А обуславливается разница тем, что string.Concat() делает чуть больше проверок и перенаправляет вызов более универсальной функции. Реально этот "оврехэд" настолько мал (худший вариант практически на порядок меньше реальной конкатинации), что учитывать его — это маразм.

Ну, а третий варинат (где конкатинируется маленькая, но реальная строка "qwre") как раз замечательно демонстрирует, что использовать StringGuilder для конкатинации двух строк — это оверкил.

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

D>Кстати, в статье, первые два абзаца раздела "Тесты" какие-то бредовые.

D>"... если вы тестируете скорость ... проверку результатов лучше выполнять ...". Зачем связали тестирование на корректность и на скорость?

Ужас какой. Неужели ты не понимаешь таких банальных вещей? При некооректных результатах все измерения будут так же некорректными. Нда, блин. Эту тему нужно не в юмор было кидать, так как это уже совсем грустно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Очередной ратный подвиг индусокодеров
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 18.01.07 18:34
Оценка:
Здравствуйте, VladD2, Вы писали:

K>>Интересно, как часто вызывается данная функция? Будет ли программа, вызывающая её, работать гораздо быстрее в целом, если мы выиграем пару тактов процессора?


VD>По меркам компьютера — раз в 10 лет. Она вызывается при выводе сообщений об ошибках в окно Output. Так что рассуждать о производительности тут просто смешно. Но дело ведь не в этом. Лично мне интересен полет фантазии товарища написавшего подобное.


Просто меня удивило, что товарищ Lepsik придрался к производительности, как и вообще удивляют многие другие товарищи, которые оптимизируют всё, что не лень. ИМХО, в таких случаях важна читабельность кода, а не производительность. А если иметь прямые руки, светлый ум, и, главное, правильный компилятор правильного языка , то можно сочетать производительность с читабельностью.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Очередной ратный подвиг индусокодеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.01.07 20:46
Оценка: -1
Здравствуйте, konsoletyper, Вы писали:

K>Просто меня удивило, что товарищ Lepsik придрался к производительности, как и вообще удивляют многие другие товарищи, которые оптимизируют всё, что не лень. ИМХО, в таких случаях важна читабельность кода, а не производительность.


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

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


Это да. Но боюсь, что те кто серьезно расуждоает о производительности и темболее оправданности такого кода до правильного компилятора правильного языка не доросли. Ну, да оно и к лучшему. Так что не будем говорить как он называется.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Очередной ратный подвиг индусокодеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.01.07 20:46
Оценка:
Здравствуйте, IvanDunaev, Вы писали:

ID>речь идет о "засушивании" кода, когда единообразие и формальность подхода превалируют над частностями, позволяющими выиграть пару строк / тактов. конечно, данный конктретный случай слишком гиперболистичен, чтобы служить типичным примером.


Тебе такие слова как "читаемость кода" что-то говорят? Или ради единообразия ты готов всю жизнь смотреть на ровныи и стройные ряды макароного кода?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Очередной ратный подвиг индусокодеров
От: Demon Россия  
Дата: 19.01.07 05:32
Оценка:
Здравствуйте, VladD2, Вы писали:

D>>(в сторону): Сейчас начнутся указания, типа "а надо было перегружаться между тестами", "надо было GC запускать".

VD>Зачем? Я бы просто посоветовал "включить" голову и подумать над тем, что ты измерял.
Я измерял скорость выполнения двух функций на разных входных данных.

VD>Первые два варианта не приводят к использованию StringGuilder-а, так как срабатывает проверка:

VD>
VD>if (string.IsNullOrEmpty(message))
VD>    return Environment.NewLine;
VD>

VD>в приложении она практически бесполезна, так как сообщения с пустым телом — это нонсенс и кроме как в случае ошибки возникнуть не могут.
Так изначально и говорилось "в ряде случаев оригинал работает гораздо быстрее твоего кода". То, что эти случаи возникают крайне редко, не означает, что скорость их выполнение мерять нельзя. А если в этих случаях функция будет выполняться несколько часов (преувеличиваю, конечно)? Кстати, если смотреть только на эту функцию, не принимаю во внимание для чего она используется, вероятность появления какого-либо значения в параметре предсказать нельзя. Т.ч. если человеку задано написать функцию и померять скорость ее выполнения, замеры должны покрывать все множество входных значений (ну это по хорошему).

VD>Ну, да добавь эти строки во второй варинат и разница мужду ними исчезнет. А обуславливается разница тем, что string.Concat() делает чуть больше проверок и перенаправляет вызов более универсальной функции. Реально этот "оврехэд" настолько мал (худший вариант практически на порядок меньше реальной конкатинации), что учитывать его — это маразм.

Зато на других входных данных вторая функция замедлится. Такими шагами ты докатишься до первого варианта.

VD>Конечно тестирование в дебаге — это бессмысленное занятие, но даже в нем StringGuilder в двое медленее. Оно и понятно, ведь кроме собственно конкатинации строк там создается еще лишний объект и делаются лишние проверки.

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

D>>Кстати, в статье, первые два абзаца раздела "Тесты" какие-то бредовые.

D>>"... если вы тестируете скорость ... проверку результатов лучше выполнять ...". Зачем связали тестирование на корректность и на скорость?

VD>Ужас какой. Неужели ты не понимаешь таких банальных вещей? При некооректных результатах все измерения будут так же некорректными. Нда, блин. Эту тему нужно не в юмор было кидать, так как это уже совсем грустно.


Так, если ты не понял то, что я сказал, это не означает, что я дурак. Хотя, наверное, дурак, раз не смог толком объяснить.
Повторюсь "Зачем связали тестирование на корректность и на скорость?". Тесты нужно писать как можно более мелкие. Т.е. что бы они тестировали как можно меньшую функциональность. В этом случае, когда из пачки тестов один отвалится, проблемное место будет более локализованное.
В данном случае я бы написал в стиле "прежде чем тестировать скорострельность, проверьте корректность". Хотя можно в любом порядке, но тогда рассматривать их как транзакцию: если хоть один тест не прошел, значит и другие могли наврать.
Re[5]: Очередной ратный подвиг индусокодеров
От: serg_fork  
Дата: 19.01.07 06:11
Оценка: :)
Здравствуйте, VladD2, Вы писали:

VD>Для генерации строк из заранее неизвестного количества подстрок или значений (преобразумых в строки).

VD>Если стоит задача сложить Х строк, то стринг-билдер тут оверкил. Это грамоздко и бессмысленно. Конечно в большинстве случаев разницу будет в микроскоп не увидить, но дело даже не в скорости.

Вчера перешерстил Reflector`ом код из сборки system. Мама дорогая, там все на стрингбилдере!!!
Вот например, Path.IO
public static string GetTempFileName()
{
      string a_TmpPath = Path.GetTempPath();
      new FileIOPermission(FileIOPermissionAccess.Write, a_TmpPath).Demand();
      StringBuilder sb = new StringBuilder(MAX_PATH);
      if (Win32Native.GetTempFileName(a_TmpPath, "tmp", 0, sb) == 0)
      {
            __Error.WinIOError();
      }
      return sb.ToString();
}
Re[7]: Очередной ратный подвиг индусокодеров
От: IvanDunaev  
Дата: 19.01.07 07:57
Оценка: -1
Здравствуйте, VladD2, Вы писали:

VD>Тебе такие слова как "читаемость кода" что-то говорят?


а ты можешь дать формальное определение читаемости, без традиционных фобических девиаций?

VD>Или ради единообразия ты готов всю жизнь смотреть на ровныи и стройные ряды макароного кода?


я готов спокойно воспринимать пусть неидеальный, но достаточно добротный и лишенный серьезных изъянов код, потому что я реалист и мне некогда атаковать ветряные мельницы.
Re[6]: Очередной ратный подвиг индусокодеров
От: master_of_shadows Беларусь  
Дата: 19.01.07 10:30
Оценка:
Здравствуйте, IvanDunaev, Вы писали:

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

Удивительный человек, задал вопрос, получил ответ и начал возмущаться. Кстати да, думаю данный код будет откровением для автора изначального кода.

ID>речь идет о "засушивании" кода, когда единообразие и формальность подхода превалируют над частностями, позволяющими выиграть пару строк / тактов. конечно, данный конктретный случай слишком гиперболистичен, чтобы служить типичным примером.

Здесь что то не понял .
Re[8]: Очередной ратный подвиг индусокодеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.07 11:01
Оценка:
Здравствуйте, IvanDunaev, Вы писали:

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


VD>>Тебе такие слова как "читаемость кода" что-то говорят?


ID>а ты можешь дать формальное определение читаемости, без традиционных фобических девиаций?


Формальное определение слвам вообще дать нельзя. Нет формального механизма. А просто определение дать могу за проста:
Readability
Удобочитаемость

VD>>Или ради единообразия ты готов всю жизнь смотреть на ровныи и стройные ряды макароного кода?


ID>я готов спокойно воспринимать пусть неидеальный, но достаточно добротный и лишенный серьезных изъянов код, потому что я реалист и мне некогда атаковать ветряные мельницы.


Макаронный код никогда не будет добротным. Он является причиной других проблем. Люди которые не пользуются принципом выбора наиболее простых решений (из имеющихся в наличии и удовлетворяющих прочим условиям) в принципе не способны на решение сложных задач.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Очередной ратный подвиг индусокодеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.07 11:01
Оценка: +1
Здравствуйте, serg_fork, Вы писали:

_>Вчера перешерстил Reflector`ом код из сборки system. Мама дорогая, там все на стрингбилдере!!!

_>Вот например, Path.IO
_>
_>public static string GetTempFileName()
_>{
_>      string a_TmpPath = Path.GetTempPath();
_>      new FileIOPermission(FileIOPermissionAccess.Write, a_TmpPath).Demand();
_>      StringBuilder sb = new StringBuilder(MAX_PATH);
_>      if (Win32Native.GetTempFileName(a_TmpPath, "tmp", 0, sb) == 0)
_>      {
_>            __Error.WinIOError();
_>      }
_>      return sb.ToString();
_>}
_>


На самом деле этот код как раз оправдан. Дело в том, что в данном случае программист выполнял требования PInvoke. Фнукция GetTempFileName это не управляемая функция импортируемая из kernel32.dll.

Таковы уже особенности интеропа с неуправляемым кодом. Ему нужно было передать буфер заведомо приемлемого размера и потом только часть этого буфера интерпретировать как строку. В нитеропе дотнета для этих целей шататно используется StringBuilder.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Очередной ратный подвиг индусокодеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.07 12:09
Оценка: -1
Здравствуйте, Demon, Вы писали:

D>Так изначально и говорилось "в ряде случаев оригинал работает гораздо быстрее твоего кода".


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

Я не даром тебе дал ссылку на ту статью. Там есть очено правильные слова и по этому поводу:

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



D>То, что эти случаи возникают крайне редко, не означает, что скорость их выполнение мерять нельзя.


Еще раз. Там вообще говорить не очем когда речь идет о пустх строках. Есть такое понятие как осмысленная точность измерений.

D> А если в этих случаях функция будет выполняться несколько часов (преувеличиваю, конечно)?


Конечно приувеличивашь. Смысла в выполнении пустого цикла с одним if-ом нет. Темболее его нет смысла выполнять несколько часов. А появление первого осмысленного действия приведет к тому, что результат проверок на null исчезнет.

D> Кстати, если смотреть только на эту функцию, не принимаю во внимание для чего она используется, вероятность появления какого-либо значения в параметре предсказать нельзя.


Ага. Я это называю "сфероконемания". Функция с названием FormatMessage() пребавляющая конец строки к другой строке может не говорить о ее применении только тому кто совсем оторвался от реальности.

D> Т.ч. если человеку задано написать функцию и померять скорость ее выполнения, замеры должны покрывать все множество входных значений (ну это по хорошему).


Уломал речистый. Тогда все же порудись объяснить зачем ее автор использовал StringBuilder. Ведь твои смелые научные эксперементы хорошо показали бессысленность этого занятия. Не так ли?

VD>>Конечно тестирование в дебаге — это бессмысленное занятие, но даже в нем StringGuilder в двое медленее. Оно и понятно, ведь кроме собственно конкатинации строк там создается еще лишний объект и делаются лишние проверки.

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

А зачем ты это указал, если StringGuilder медленее всегда? И вообще к чему это обсуждение? Ты серьезно считашь код приведенного метода разумным?

D>Повторюсь "Зачем связали тестирование на корректность и на скорость?".


Отвечаю. Никто ничего не связывал. Ты умудрился прочесть книгу и увидить сам знаешь что. Прочти еще раз, внимательно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Очередной ратный подвиг индусокодеров
От: Demon Россия  
Дата: 22.01.07 07:50
Оценка: 1 (1) -1
Здравствуйте, VladD2, Вы писали:

D>>Так изначально и говорилось "в ряде случаев оригинал работает гораздо быстрее твоего кода".


VD>И где ты усмотрел "гораздо быстрее"? Или 10 милисек. на 10 миллионов итераций это в некоторых кругах и считается горазно быстрее? Ты вообще понимашь, что в случае пусой строки и темболее null-а речь уже идет о тактах процессора? Это вообще осбуждать бессмысленно.

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

VD>Я не даром тебе дал ссылку на ту статью. Там есть очено правильные слова и по этому поводу:

VD>

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

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

D>> А если в этих случаях функция будет выполняться несколько часов (преувеличиваю, конечно)?


VD>Конечно приувеличивашь. Смысла в выполнении пустого цикла с одним if-ом нет. Темболее его нет смысла выполнять несколько часов. А появление первого осмысленного действия приведет к тому, что результат проверок на null исчезнет.


А ты всегда по коду можешь сказать, сколько времени он будет выполняться?
А может в какой-нить реализации .Net код "message + Environment.NewLine" будет вылавливать null значения через эксепшены? А у тебя все эксепшены будут логироваться в файл.

D>> Кстати, если смотреть только на эту функцию, не принимая во внимание для чего она используется, вероятность появления какого-либо значения в параметре предсказать нельзя.


VD>Ага. Я это называю "сфероконемания". Функция с названием FormatMessage() пребавляющая конец строки к другой строке может не говорить о ее применении только тому кто совсем оторвался от реальности.


Ну раскажи мне, оторванному от реальности, в каком проценте вызовов этой функции ей передается пустая строка.

D>> Т.ч. если человеку задано написать функцию и померять скорость ее выполнения, замеры должны покрывать все множество входных значений (ну это по хорошему).


VD>Уломал речистый. Тогда все же порудись объяснить зачем ее автор использовал StringBuilder. Ведь твои смелые научные эксперементы хорошо показали бессысленность этого занятия. Не так ли?

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

VD>>>Конечно тестирование в дебаге — это бессмысленное занятие, но даже в нем StringGuilder в двое медленее. Оно и понятно, ведь кроме собственно конкатинации строк там создается еще лишний объект и делаются лишние проверки.

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

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

Ты не путай теплое с мягким. Указание было для того, чтобы народ не ломанулся в эти двери. А StringBuilder здесь не причем.
VD>И вообще к чему это обсуждение? Ты серьезно считашь код приведенного метода разумным?
Отвечу сразу на два вопроса.
Я считаю неразумным делить мир на черное и белое. Да к тому же ставить себя на белую часть.
Если ты уверен, что нечто одно белее чем нечто другое, никогда не будет вредным присмотреться и понять в каком месте оно белее. Даже если белый медведь вцелом белее бурого, нос у него может быть чернее.


D>>Повторюсь "Зачем связали тестирование на корректность и на скорость?".


VD>Отвечаю. Никто ничего не связывал. Ты умудрился прочесть книгу и увидить сам знаешь что. Прочти еще раз, внимательно.

Прочитал. Не помогло. Перед сном еще поперечитываю.
Предлагаю закрыть эту тему, т.к.
1. Тогда мне ночью будут сниться сортирующие компиляторы
2. На лицо зашоренность взгляда. Как у тебя, так и у меня. Тяжело взглянуть на вещь со стороны, отличной от первоначальной.
Re[10]: Очередной ратный подвиг индусокодеров
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 22.01.07 09:23
Оценка: +1
Здравствуйте, Demon, Вы писали:

D>А я ничего не усматривал. Я просто померял скорость. И моей целью не было доказать вышерасположенное утверждение. Вот, например, ты наверняка считал, что твоя функция всегда работает быстрее, ан нет. Ну если не ты, то кто-то другой наверняка. Вот тебе (ему) повод подумать, а почему в этих случаях она на копейки, но медленнее. А может можно написать функцию, работающую раза в два быстрее?


Причём тут вообще скорость? Никто ничего кроме тебя вообще не думал. Заметь, это ты начал распространяться по поводу скорости.

D>Совершенно согласен. Вот только к данной ситуации они не особо применимы. Я же ничего не "превозносил", и ничего не называл "существенным недостатком". Я всего то предложил подумать, почему результаты получились такие.


Вот и будем думать, когда такая функция будет вызываться по 1000000 раз в сенкунду. А сейчас то зачем голову ломать? Главное — читабельность. А так мы и читабельность гробим, и время своё на обдумывание такой мелочи.

D>А может в какой-нить реализации .Net код "message + Environment.NewLine" будет вылавливать null значения через эксепшены? А у тебя все эксепшены будут логироваться в файл.


Не будет. Или это будет уже не реализацией .NET (т.к. все эти вещи в стандарте оговорены), так что спросу тут никакого быть не может.

D>Не так. Они показали, что он медленный в данном случае, но у него могут быть другие достоинства. А может и не быть. Не надо меня приписывать к агитаторам первого варианта.

D>Это уже другие делали, не хочется мне фантазировать на эту тему.

Ну, пошли размышления по поводу того, какие достоинства есть у StringBuilder'а. Может, отдельную ветку по этому поводу откроем? Или к администрации RSDN постучимся и создадим форум, посвящённый этой тематике, а тебя модератором назначим?

D>Я считаю неразумным делить мир на черное и белое. Да к тому же ставить себя на белую часть.

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

Да вы, батенька, философ! А со стороны это выглядит так. Ты поделил мир на чёрное и белое согласно только что приведённому критерию, причём всех, кто по твоему скромному мнению этих правил не придерживается, тот находится на чёрной стороне, а ты (кто бы сомневался) — на белой.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: Очередной ратный подвиг индусокодеров
От: Demon Россия  
Дата: 22.01.07 10:01
Оценка:
Здравствуйте, konsoletyper, Вы писали:

D>>А я ничего не усматривал. Я просто померял скорость. И моей целью не было доказать вышерасположенное утверждение. Вот, например, ты наверняка считал, что твоя функция всегда работает быстрее, ан нет. Ну если не ты, то кто-то другой наверняка. Вот тебе (ему) повод подумать, а почему в этих случаях она на копейки, но медленнее. А может можно написать функцию, работающую раза в два быстрее?


K>Причём тут вообще скорость?

При том, что в этом поддереве обсуждения, идет разговор про скорость.
K>Никто ничего кроме тебя вообще не думал.
Зачем же ты всех так оговариваешь? Может быть ты ни о чем не думал.
K>Заметь, это ты начал распространяться по поводу скорости.
Заметь, не я. В корневом посте было "Причем получится не только читабельнее, но и чуточку быстрее".

D>>Совершенно согласен. Вот только к данной ситуации они не особо применимы. Я же ничего не "превозносил", и ничего не называл "существенным недостатком". Я всего то предложил подумать, почему результаты получились такие.


K>Вот и будем думать, когда такая функция будет вызываться по 1000000 раз в сенкунду. А сейчас то зачем голову ломать? Главное — читабельность. А так мы и читабельность гробим, и время своё на обдумывание такой мелочи.

Иногда стоит подумать не только над насущными проблемами.

D>>А может в какой-нить реализации .Net код "message + Environment.NewLine" будет вылавливать null значения через эксепшены? А у тебя все эксепшены будут логироваться в файл.


K>Не будет. Или это будет уже не реализацией .NET (т.к. все эти вещи в стандарте оговорены), так что спросу тут никакого быть не может.

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

D>>Не так. Они показали, что он медленный в данном случае, но у него могут быть другие достоинства. А может и не быть. Не надо меня приписывать к агитаторам первого варианта.

D>>Это уже другие делали, не хочется мне фантазировать на эту тему.

K>Ну, пошли размышления по поводу того, какие достоинства есть у StringBuilder'а. Может, отдельную ветку по этому поводу откроем? Или к администрации RSDN постучимся и создадим форум, посвящённый этой тематике, а тебя модератором назначим?

Где пошли? Куда пошли? По-моему, я довольно четко сказал, что не хочу обсуждать StringBuilder.

D>>Я считаю неразумным делить мир на черное и белое. Да к тому же ставить себя на белую часть.

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

K>Да вы, батенька, философ! А со стороны это выглядит так. Ты поделил мир на чёрное и белое согласно только что приведённому критерию, причём всех, кто по твоему скромному мнению этих правил не придерживается, тот находится на чёрной стороне, а ты (кто бы сомневался) — на белой.

Ээээ, какому критерию? каких правил? Я высказал свою точку зрения, и естественно, она мне кажется "белее". Это ж философия, тут ничего не докажешь
Re[10]: Очередной ратный подвиг индусокодеров
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.01.07 10:21
Оценка:
Здравствуйте, Demon, Вы писали:

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

D>Ты не путай теплое с мягким. Указание было для того, чтобы народ не ломанулся в эти двери. А StringBuilder здесь не причем.

Я ничего не путаю. Это и была основная претензия. Бессмысленное использование более тяжелого способа канкатинации строк. Точнее даже претензию вызвает сам факт бездумного кодирования приводящего к более медленному (при любых условиях!) коду и к серьезному его запутыванию.

VD>>И вообще к чему это обсуждение? Ты серьезно считашь код приведенного метода разумным?

D>Отвечу сразу на два вопроса.
D>Я считаю неразумным делить мир на черное и белое. Да к тому же ставить себя на белую часть.
D>Если ты уверен, что нечто одно белее чем нечто другое, никогда не будет вредным присмотреться и понять в каком месте оно белее. Даже если белый медведь вцелом белее бурого, нос у него может быть чернее.

А я считаю, что есть люди которые не думают вообще — это как раз те кто пишут приведенный код. А есть люди — зануды, которые докапываются к совершенно посторонним и малозначительным фактам и пытаются развить их обсуждение в филосоские беседы. Дагадайся с трех раз на кого я намекаю.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Очередной ратный подвиг индусокодеров
От: Eugeny__ Украина  
Дата: 24.01.07 14:17
Оценка:
Здравствуйте, konsoletyper, Вы писали:


K>Просто меня удивило, что товарищ Lepsik придрался к производительности, как и вообще удивляют многие другие товарищи, которые оптимизируют всё, что не лень. ИМХО, в таких случаях важна читабельность кода, а не производительность. А если иметь прямые руки, светлый ум, и, главное, правильный компилятор правильного языка , то можно сочетать производительность с читабельностью.


И сразу вопрос: вариант со стрингбилдерами для Вас более читабельный, чем приведенный Владом2?
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.