Очередной ратный подвиг индусокодеров
От: 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>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.