Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Судя по всему, это просто маркер текущего потока, который модифицирует строку. Кстати, я не сообразил, что ты привёл код FW-шного стрингбилдера.
Особенностью FW наверное является присутствие методов с Internal
Здравствуйте, Serginio1, Вы писали:
S>Еще по умолчанию Capacity он же ArrayLength = 16, S>Если строка меньше 8 то будет постоянно копироваться.
Угу. Ну, тогда результаты тестов становятся объяснимыми. По сути StringBuilder заточен под определённый паттерн использования: создать строку, при необходимости зарезервировав не более, чем 2xLength символов, и отдать строку единственным ToString. Дальше StringBuilder уходит в GC.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Serginio1, Вы писали:
ГВ>>Судя по всему, это просто маркер текущего потока, который модифицирует строку. Кстати, я не сообразил, что ты привёл код FW-шного стрингбилдера. S>Особенностью FW наверное является присутствие методов с Internal
S>
Как я понимаю, как раз в InternalCopy зарыта синхронизация.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
S>>Еще по умолчанию Capacity он же ArrayLength = 16, S>>Если строка меньше 8 то будет постоянно копироваться.
ГВ>Угу. Ну, тогда результаты тестов становятся объяснимыми. По сути StringBuilder заточен под определённый паттерн использования: создать строку, при необходимости зарезервировав не более, чем 2xLength символов, и отдать строку единственным ToString. Дальше StringBuilder уходит в GC.
Именно так. Потому я и говорил, что вызов ToString после каждого Append`а почти что нонсенс.
Здравствуйте, criosray, Вы писали:
ГВ>>Угу. Ну, тогда результаты тестов становятся объяснимыми. По сути StringBuilder заточен под определённый паттерн использования: создать строку, при необходимости зарезервировав не более, чем 2xLength символов, и отдать строку единственным ToString. Дальше StringBuilder уходит в GC. C>Именно так. Потому я и говорил, что вызов ToString после каждого Append`а почти что нонсенс.
Так это не нонсенс, а использование, противоречащее предполагаемому паттерну. ИМХО, лучше было бы сделать что-то вроде DetachString, который бы гарантированно отдавал накопленную строку. По крайней мере, путаницы бы возникало меньше.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
ГВ>ИМХО, лучше было бы сделать что-то вроде DetachString, который бы гарантированно отдавал накопленную строку. По крайней мере, путаницы бы возникало меньше.
Или, например, можно было бы явно определять политику использования буфера параметрами конструктора StringBuilder-а. А так, знаешь, пытаться вжиться в образ индуса, не ведающего программирования, не у всех быстро удаётся.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
ГВ>Как я понимаю, как раз в InternalCopy зарыта синхронизация.
В основном это унсейвные или extern закрытые методы.
Кстати поставь себе reflector http://www.red-gate.com/products/reflector/
Очень поучительная штука.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
ГВ>>Как я понимаю, как раз в InternalCopy зарыта синхронизация. S> В основном это унсейвные или extern закрытые методы. S> Кстати поставь себе reflector http://www.red-gate.com/products/reflector/ S>Очень поучительная штука.
Спасибо, кстати. Я сам на C# практически ничего не пишу, а так сцепишься с кем — и апеллировать не к чему.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Спасибо, кстати. Я сам на C# практически ничего не пишу, а так сцепишься с кем — и апеллировать не к чему.
C# не основной язык. Просто очень удобно посмотреть внутренности, иногда подсмотреть алгоритмы.
Читается код очень легко. (есть конечно и навороты бошку сломаешь).
Кстати заметь в этой ветке рефлектор многократно упоминается. А врага надо знать в лицо, а там и в друга превратится
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
ГВ>>Спасибо, кстати. Я сам на C# практически ничего не пишу, а так сцепишься с кем — и апеллировать не к чему. S>C# не основной язык. Просто очень удобно посмотреть внутренности, иногда подсмотреть алгоритмы. S> Читается код очень легко. (есть конечно и навороты бошку сломаешь). S> Кстати заметь в этой ветке рефлектор многократно упоминается. А врага надо знать в лицо, а там и в друга превратится
Да какой из .Net враг-то? Потешный, разве что.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
ГВ>>>Спасибо, кстати. Я сам на C# практически ничего не пишу, а так сцепишься с кем — и апеллировать не к чему. S>>C# не основной язык. Просто очень удобно посмотреть внутренности, иногда подсмотреть алгоритмы. S>> Читается код очень легко. (есть конечно и навороты бошку сломаешь). S>> Кстати заметь в этой ветке рефлектор многократно упоминается. А врага надо знать в лицо, а там и в друга превратится
ГВ>Да какой из .Net враг-то? Потешный, разве что.
Здравствуйте, 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.: Винодельческие провинции — это есть рулез!
Здравствуйте, criosray, Вы писали:
ГВ>>Да какой из .Net враг-то? Потешный, разве что. C>Ну уж С++ дотнету точно не враг. Вот джава — да.
Да ясное дело — куда ж дотнет без C++?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
S>там есть RStringBuilder тоже сделанный для тестов, но чиста манагедный.
В сущности, у меня никаких сомнений, что раньше или позже должны были прийти к "зоопарку затычек".
[блестит меч джедая — on]
Правда, как это соотносится с восхвалениями Единственного Стандартного Самого Правильного Решения, Представляемого В .NET — тайна сия велика есть. Знаешь, есть очень большое рациональное зерно в высказываниях о том, что в мозгах "простого человека" легко уживаются именно противоречивые мифы — старик Геббельс был прав, говоря о том, что пропаганда должна строиться на совершенно невероятной лжи.
[блестит меч джедая — off]
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>В сущности, у меня никаких сомнений, что раньше или позже должны были прийти к "зоопарку затычек".
Правды ради надо заметить, что существующего функционала хватает за глаза, хотя и несильно оптимизированного.
Кстати многие проблемы как раз торчат из философии и привязаннонсти к С++ местных писателей.
Так, что сказывается тяжелая наследственность
А то, что все универсальное не есть серебрянная пуля, да и велосипед создавать то никто не запрещал.
Иногда собственные велосипеды могуть быть намного лучше заводских.
В конце то концов каждый выбирает инструмент для себя.
и солнце б утром не вставало, когда бы не было меня
650 GB/sec? Слушай, а бесконечный цикл за сколько секунд прокрутит?
P.S.: Ты хоть понял, что я мерил?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, criosray, Вы писали:
ГВ>>Собственно, снова два теста: C>Этот маразм всем маразмам маразм. C>Исправленный код:
Плохо исправил... кто там меня обвинял в изобретение велосипедов (_itoa -> _itow)?
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>В сущности, у меня никаких сомнений, что раньше или позже должны были прийти к "зоопарку затычек". S> Правды ради надо заметить, что существующего функционала хватает за глаза, хотя и несильно оптимизированного.
Ровно то же самое справедливо и в отношении C++.
S>Кстати многие проблемы как раз торчат из философии и привязаннонсти к С++ местных писателей. S>Так, что сказывается тяжелая наследственность
Не надо дудеть в дудку мозговедения. Почему-то даже "не привязанные к C++" отмечают притормаживания .Net. Взять высказывания того же vdimas из соседнего топика.
S> А то, что все универсальное не есть серебрянная пуля, да и велосипед создавать то никто не запрещал.
Ну... Зоопарк, затычки, недоязык — классика жанра высказываний "дотнетчиков" в адрес C++.
S>Иногда собственные велосипеды могуть быть намного лучше заводских. S> В конце то концов каждый выбирает инструмент для себя.
Это понятно.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!