Re[63]: Ну ты вообще многого не видишь... ;)
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.06.09 12:02
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Судя по всему, это просто маркер текущего потока, который модифицирует строку. Кстати, я не сообразил, что ты привёл код FW-шного стрингбилдера.


Особенностью FW наверное является присутствие методов с Internal

Thread.InternalGetCurrentThread()
string.InternalCopy
и солнце б утром не вставало, когда бы не было меня
Re[64]: Ну ты вообще многого не видишь... ;)
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.06.09 12:03
Оценка: +1
Здравствуйте, Serginio1, Вы писали:

S>Еще по умолчанию Capacity он же ArrayLength = 16,

S>Если строка меньше 8 то будет постоянно копироваться.

Угу. Ну, тогда результаты тестов становятся объяснимыми. По сути StringBuilder заточен под определённый паттерн использования: создать строку, при необходимости зарезервировав не более, чем 2xLength символов, и отдать строку единственным ToString. Дальше StringBuilder уходит в GC.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[64]: Ну ты вообще многого не видишь... ;)
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.06.09 12:05
Оценка:
Здравствуйте, Serginio1, Вы писали:

ГВ>>Судя по всему, это просто маркер текущего потока, который модифицирует строку. Кстати, я не сообразил, что ты привёл код FW-шного стрингбилдера.

S>Особенностью FW наверное является присутствие методов с Internal

S>
S>Thread.InternalGetCurrentThread()
S>string.InternalCopy
S>


Как я понимаю, как раз в InternalCopy зарыта синхронизация.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[65]: Ну ты вообще многого не видишь... ;)
От: criosray  
Дата: 09.06.09 12:07
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:


S>>Еще по умолчанию Capacity он же ArrayLength = 16,

S>>Если строка меньше 8 то будет постоянно копироваться.

ГВ>Угу. Ну, тогда результаты тестов становятся объяснимыми. По сути StringBuilder заточен под определённый паттерн использования: создать строку, при необходимости зарезервировав не более, чем 2xLength символов, и отдать строку единственным ToString. Дальше StringBuilder уходит в GC.


Именно так. Потому я и говорил, что вызов ToString после каждого Append`а почти что нонсенс.
Re[66]: Ну ты вообще многого не видишь... ;)
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.06.09 12:10
Оценка:
Здравствуйте, criosray, Вы писали:

ГВ>>Угу. Ну, тогда результаты тестов становятся объяснимыми. По сути StringBuilder заточен под определённый паттерн использования: создать строку, при необходимости зарезервировав не более, чем 2xLength символов, и отдать строку единственным ToString. Дальше StringBuilder уходит в GC.

C>Именно так. Потому я и говорил, что вызов ToString после каждого Append`а почти что нонсенс.

Так это не нонсенс, а использование, противоречащее предполагаемому паттерну. ИМХО, лучше было бы сделать что-то вроде DetachString, который бы гарантированно отдавал накопленную строку. По крайней мере, путаницы бы возникало меньше.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[67]: Дополнение
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.06.09 12:13
Оценка:
ГВ>ИМХО, лучше было бы сделать что-то вроде DetachString, который бы гарантированно отдавал накопленную строку. По крайней мере, путаницы бы возникало меньше.

Или, например, можно было бы явно определять политику использования буфера параметрами конструктора StringBuilder-а. А так, знаешь, пытаться вжиться в образ индуса, не ведающего программирования, не у всех быстро удаётся.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[65]: Ну ты вообще многого не видишь... ;)
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.06.09 12:16
Оценка: 2 (1)
Здравствуйте, Геннадий Васильев, Вы писали:

S>>Особенностью FW наверное является присутствие методов с Internal


S>>
S>>Thread.InternalGetCurrentThread()
S>>string.InternalCopy
S>>


ГВ>Как я понимаю, как раз в InternalCopy зарыта синхронизация.

В основном это унсейвные или extern закрытые методы.
Кстати поставь себе reflector http://www.red-gate.com/products/reflector/
Очень поучительная штука.
и солнце б утром не вставало, когда бы не было меня
Re[66]: Ну ты вообще многого не видишь... ;)
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.06.09 12:20
Оценка:
Здравствуйте, Serginio1, Вы писали:

ГВ>>Как я понимаю, как раз в InternalCopy зарыта синхронизация.

S> В основном это унсейвные или extern закрытые методы.
S> Кстати поставь себе reflector http://www.red-gate.com/products/reflector/
S>Очень поучительная штука.

Спасибо, кстати. Я сам на C# практически ничего не пишу, а так сцепишься с кем — и апеллировать не к чему.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[67]: Ну ты вообще многого не видишь... ;)
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.06.09 12:34
Оценка: +1 :)
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Спасибо, кстати. Я сам на C# практически ничего не пишу, а так сцепишься с кем — и апеллировать не к чему.

C# не основной язык. Просто очень удобно посмотреть внутренности, иногда подсмотреть алгоритмы.
Читается код очень легко. (есть конечно и навороты бошку сломаешь).
Кстати заметь в этой ветке рефлектор многократно упоминается. А врага надо знать в лицо, а там и в друга превратится
и солнце б утром не вставало, когда бы не было меня
Re[68]: Ну ты вообще многого не видишь... ;)
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.06.09 12:42
Оценка: :)
Здравствуйте, Serginio1, Вы писали:

ГВ>>Спасибо, кстати. Я сам на C# практически ничего не пишу, а так сцепишься с кем — и апеллировать не к чему.

S>C# не основной язык. Просто очень удобно посмотреть внутренности, иногда подсмотреть алгоритмы.
S> Читается код очень легко. (есть конечно и навороты бошку сломаешь).
S> Кстати заметь в этой ветке рефлектор многократно упоминается. А врага надо знать в лицо, а там и в друга превратится

Да какой из .Net враг-то? Потешный, разве что.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[69]: Ну ты вообще многого не видишь... ;)
От: criosray  
Дата: 09.06.09 13:10
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:


ГВ>>>Спасибо, кстати. Я сам на C# практически ничего не пишу, а так сцепишься с кем — и апеллировать не к чему.

S>>C# не основной язык. Просто очень удобно посмотреть внутренности, иногда подсмотреть алгоритмы.
S>> Читается код очень легко. (есть конечно и навороты бошку сломаешь).
S>> Кстати заметь в этой ветке рефлектор многократно упоминается. А врага надо знать в лицо, а там и в друга превратится

ГВ>Да какой из .Net враг-то? Потешный, разве что.


Ну уж С++ дотнету точно не враг. Вот джава — да.
Re[68]: Но продолжим органометрию
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.06.09 13:23
Оценка: -1 :)
Здравствуйте, Serginio1, Вы писали:

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


ГВ>>Спасибо, кстати. Я сам на C# практически ничего не пишу, а так сцепишься с кем — и апеллировать не к чему.

S>C# не основной язык. Просто очень удобно посмотреть внутренности, иногда подсмотреть алгоритмы.
S> Читается код очень легко. (есть конечно и навороты бошку сломаешь).
S> Кстати заметь в этой ветке рефлектор многократно упоминается. А врага надо знать в лицо, а там и в друга превратится

В контексте вышесказанного, интересно стало, насколько быстро сработает StringBuilder, когда ему гарантированно потребуется копировать память.

Собственно, снова два теста:

C++:
static const unsigned long long count = 10000000ULL;
typedef std::wstring mwstring;
mwstring ws, ws1;
for(int i = 0; i < 50; ++i)
{
  ws += L"01234567890123456789012345678901234567890123456789";
}

ws1 = ws;

DWORD dwStart = ::GetTickCount();
for(int j = 0; j < count; ++j)
{
  ws1 = ws;
}
DWORD dwEnd = ::GetTickCount();

unsigned long long copied = (unsigned long long)ws.length() * sizeof(wchar_t) * count;
unsigned long long speedKBps = (unsigned long long)copied / (unsigned long long)(dwEnd - dwStart);

std::cout << (dwEnd - dwStart) << std::endl;
std::cout << copied << " bytes copied, with speed of: " << speedKBps / 1000ULL << " MB/s" << std::endl;


C#:
const int Count = 10000000;

StringBuilder sb = new StringBuilder();
sb.EnsureCapacity(10000);
for (int i = 0; i < 50; ++i)
    sb.Append("01234567890123456789012345678901234567890123456789");
String s;

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < Count; i++)
{
    s = sb.ToString();
}
stopwatch.Stop();
Console.WriteLine("Elapsed {0}", stopwatch.Elapsed);
Console.WriteLine("Copied chars: {0}", (Int64)sb.Length * (Int64)Count);
Console.WriteLine("Average copy speed {0} MB/s", ((Int64)sb.Length * (Int64)Count * 2) / stopwatch.Elapsed.TotalMilliseconds / 1000);


Соотношение времени выполнения... 6:1 в пользу C++
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[70]: Ну ты вообще многого не видишь... ;)
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.06.09 13:24
Оценка:
Здравствуйте, criosray, Вы писали:

ГВ>>Да какой из .Net враг-то? Потешный, разве что.

C>Ну уж С++ дотнету точно не враг. Вот джава — да.

Да ясное дело — куда ж дотнет без C++?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[69]: Но продолжим органометрию
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.06.09 13:29
Оценка: 1 (1)
Здравствуйте, Геннадий Васильев, Вы писали:

В свое время обплевавшись на стандартный стрингбуилдер народ начал делать свои.
Посмотри http://www.rsdn.ru/forum/dotnet/3303143.flat.aspx#3303143
Автор: Serginio1
Дата: 24.02.09

там есть RStringBuilder тоже сделанный для тестов, но чиста манагедный.
и солнце б утром не вставало, когда бы не было меня
Re[70]: Но продолжим органометрию
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.06.09 13:35
Оценка:
Здравствуйте, Serginio1, Вы писали:

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

S>Посмотри http://www.rsdn.ru/forum/dotnet/3303143.flat.aspx#3303143
Автор: Serginio1
Дата: 24.02.09

S>там есть RStringBuilder тоже сделанный для тестов, но чиста манагедный.

В сущности, у меня никаких сомнений, что раньше или позже должны были прийти к "зоопарку затычек".

[блестит меч джедая — on]
Правда, как это соотносится с восхвалениями Единственного Стандартного Самого Правильного Решения, Представляемого В .NET — тайна сия велика есть. Знаешь, есть очень большое рациональное зерно в высказываниях о том, что в мозгах "простого человека" легко уживаются именно противоречивые мифы — старик Геббельс был прав, говоря о том, что пропаганда должна строиться на совершенно невероятной лжи.
[блестит меч джедая — off]
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[69]: Но продолжим органометрию
От: criosray  
Дата: 09.06.09 13:39
Оценка: -2 :)))
Здравствуйте, Геннадий Васильев, Вы писали:


ГВ>Собственно, снова два теста:

Этот маразм всем маразмам маразм.

ГВ>
ГВ>for (int i = 0; i < Count; i++)
ГВ>{
ГВ>    s = sb.ToString();
ГВ>}

ГВ>


ГВ>Соотношение времени выполнения... 6:1 в пользу C++


.NET
Elapsed 00:00:00.0765671
Copied chars: 25000000000
Average copy speed 653021,989862486 MB/s

C++
2605
50000000000 bytes copied, with speed of: 19193 MB/s

Исправленный код:
            const long count = 10000000;

            var sb = new StringBuilder();
            
            sb.EnsureCapacity(10000);

            for (int i = 0; i < 50; ++i)
                sb.Append("01234567890123456789012345678901234567890123456789");
            
            String s, s1;

            var stopwatch = new Stopwatch();

            stopwatch.Start();
            
            s = sb.ToString();
            for (int i = 0; i < count; i++)
            {
                s1 = s.Substring(0, s.Length);
            }
            
            stopwatch.Stop();
            
            Console.WriteLine("Elapsed {0}", stopwatch.Elapsed);
            Console.WriteLine("Copied chars: {0}", sb.Length * count);
            Console.WriteLine("Average copy speed {0} MB/s", (sb.Length * count * 2) / stopwatch.Elapsed.TotalMilliseconds / 1000);


Соотношение считайте сами.
Re[71]: Но продолжим органометрию
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.06.09 13:48
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>В сущности, у меня никаких сомнений, что раньше или позже должны были прийти к "зоопарку затычек".

Правды ради надо заметить, что существующего функционала хватает за глаза, хотя и несильно оптимизированного.

Кстати многие проблемы как раз торчат из философии и привязаннонсти к С++ местных писателей.
Так, что сказывается тяжелая наследственность
А то, что все универсальное не есть серебрянная пуля, да и велосипед создавать то никто не запрещал.
Иногда собственные велосипеды могуть быть намного лучше заводских.
В конце то концов каждый выбирает инструмент для себя.
и солнце б утром не вставало, когда бы не было меня
Re[70]: Но продолжим органометрию
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.06.09 13:52
Оценка: +1
Здравствуйте, criosray, Вы писали:

C>.NET

C>Average copy speed 653021,989862486 MB/s

C>C++

C>50000000000 bytes copied, with speed of: 19193 MB/s

C>Соотношение считайте сами.


650 GB/sec? Слушай, а бесконечный цикл за сколько секунд прокрутит?

P.S.: Ты хоть понял, что я мерил?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[70]: Но продолжим органометрию
От: criosray  
Дата: 09.06.09 13:56
Оценка: :))
Здравствуйте, criosray, Вы писали:

ГВ>>Собственно, снова два теста:

C>Этот маразм всем маразмам маразм.
C>Исправленный код:
Плохо исправил... кто там меня обвинял в изобретение велосипедов (_itoa -> _itow)?

Console.WriteLine("Average copy speed {0} MB/s", (sb.Length * count * 2) / stopwatch.Elapsed.TotalMilliseconds / 1000);


Конечно же


Console.WriteLine("Average copy speed {0} MB/s", (s1.Length * count * 2) / stopwatch.Elapsed.TotalSeconds);


В итоге

Elapsed 00:00:00.0734006
Copied chars: 25000000000
Average copy speed 681193341743,801 MB/s



C>Соотношение считайте сами.
Re[72]: Но продолжим органометрию
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.06.09 13:59
Оценка:
Здравствуйте, Serginio1, Вы писали:

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


ГВ>>В сущности, у меня никаких сомнений, что раньше или позже должны были прийти к "зоопарку затычек".

S> Правды ради надо заметить, что существующего функционала хватает за глаза, хотя и несильно оптимизированного.

Ровно то же самое справедливо и в отношении C++.

S>Кстати многие проблемы как раз торчат из философии и привязаннонсти к С++ местных писателей.

S>Так, что сказывается тяжелая наследственность

Не надо дудеть в дудку мозговедения. Почему-то даже "не привязанные к C++" отмечают притормаживания .Net. Взять высказывания того же vdimas из соседнего топика.

S> А то, что все универсальное не есть серебрянная пуля, да и велосипед создавать то никто не запрещал.


Ну... Зоопарк, затычки, недоязык — классика жанра высказываний "дотнетчиков" в адрес C++.

S>Иногда собственные велосипеды могуть быть намного лучше заводских.

S> В конце то концов каждый выбирает инструмент для себя.

Это понятно.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.