и малость офигел — это вот так вот легко можно получить 80 сек на банальнейшей инициализации листа всего-то 8000 элементами.
Жесть. А 10 секунд на это же самое терпимо.
и малость офигел — это вот так вот легко можно получить 80 сек на банальнейшей инициализации листа всего-то 8000 элементами. GIV>Жесть. А 10 секунд на это же самое терпимо.
Я право не знаю даже как автору удалось получить такой удивительный результат.
и малость офигел — это вот так вот легко можно получить 80 сек на банальнейшей инициализации листа всего-то 8000 элементами. GIV>Жесть. А 10 секунд на это же самое терпимо.
Там дан код к примеру:
[...]что то типа так[...]
Для этого же кода без оптимизации 8000 элементов для списка у меня лично обрабатываются мгновенно.
Возможно в оригинале или полей на порядок больше, или там не std::string, а объекты со сложной инициализацией или... А, гадать долго можно
Здравствуйте, пыщьх, Вы писали:
П>Всё, меняем std::string на FixedSizeString<Необходимый_Размер> и имеем стопроцентный сиплюсплюсный аналог char szXXX[размер] = "test".
Плюс, если там вектор поюзан с поэтапным добавлением элементов без вызова reserve()...
и малость офигел — это вот так вот легко можно получить 80 сек на банальнейшей инициализации листа всего-то 8000 элементами. GIV>Жесть. А 10 секунд на это же самое терпимо.
Тут С++ ни при чем. Дело в реализации стандартной библиотеки. Хороших реализаций я не видел. Хотите быстро, пишите свою реализацию строки (ну и списка). Контейнеры в STL сделаны поразительно голимо. Хотя бы потому что там куча грязных хаков, макросов, где можно спокойно обойтись без них.
и малость офигел — это вот так вот легко можно получить 80 сек на банальнейшей инициализации листа всего-то 8000 элементами. GIV>>Жесть. А 10 секунд на это же самое терпимо.
A>Тут С++ ни при чем. Дело в реализации стандартной библиотеки. Хороших реализаций я не видел. Хотите быстро, пишите свою реализацию строки (ну и списка). Контейнеры в STL сделаны поразительно голимо. Хотя бы потому что там куча грязных хаков, макросов, где можно спокойно обойтись без них.
Когда писалась стандартная библиотека, оптимизаторы не то что ILP для allocation/scheduling решить, элементарно неиспользуемые переменные убирать не умели. По хорошему, после GCC 4.X (точно не помню, с какой версии появились IRA и прочие подобные фичи) и VS2005 стандартные библиотеки надо переписывать с нуля, дабы не выбирать между читаемостью и скоростью, а переложить весь гимор на оптимизатор...
for (int i=0;i<8000;i++)
lst.push_back (newfoo(i,i));
и еще — проблемы не с листом и т.д., а именно с инициализацией.
конечно это код утрированный — реальный отличается всякими ифами и т.п., но тормаза в инициализации.
AD>и еще — проблемы не с листом и т.д., а именно с инициализацией. AD>конечно это код утрированный — реальный отличается всякими ифами и т.п., но тормаза в инициализации.
Этот вариант (без оптимизации) тоже не получилось сделать хотя бы 5 секунд, хотя я ставил и 100`000 элементов (g++ 4.4.0). В оригинале поля были вида int и std::string или потяжелее?
и малость офигел — это вот так вот легко можно получить 80 сек на банальнейшей инициализации листа всего-то 8000 элементами. GIV>Жесть. А 10 секунд на это же самое терпимо.
Вот поэтому я и не люблю эти ваши STL и Boost. List, deque, string и прочие начинают терзать и рвать в клочья аллокатор, из за чего производительность просаживается в тысячи раз, а оверхед по памяти возрастает в десятки. String вообще использовать категорически нельзя. std::vector<char> — более-менее терпимо. А списки и дерева должны быть интрузивными.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Почему? Так у тебя только одна аллокация на хипе и несколько копирований указателя
В случае аллокации на стеке получаем помимо создания ещё конструктор копироания, а потом и деструктор. Имхо, это более тяжкий случай.
Курица — это инструмент, с помощью которого одно яйцо производит другие.
и малость офигел — это вот так вот легко можно получить 80 сек на банальнейшей инициализации листа всего-то 8000 элементами. GIV>>Жесть. А 10 секунд на это же самое терпимо.
MS>Вот поэтому я и не люблю эти ваши STL и Boost. List, deque, string и прочие начинают терзать и рвать в клочья аллокатор, из за чего производительность просаживается в тысячи раз, а оверхед по памяти возрастает в десятки. String вообще использовать категорически нельзя. std::vector<char> — более-менее терпимо. А списки и дерева должны быть интрузивными.
Напиши свой шустрый аллокатор. Или свой string. C++ позволяє
и малость офигел — это вот так вот легко можно получить 80 сек на банальнейшей инициализации листа всего-то 8000 элементами. GIV>>Жесть. А 10 секунд на это же самое терпимо.
A>Тут С++ ни при чем. Дело в реализации стандартной библиотеки. Хороших реализаций я не видел. Хотите быстро, пишите свою реализацию строки (ну и списка). Контейнеры в STL сделаны поразительно голимо. Хотя бы потому что там куча грязных хаков, макросов, где можно спокойно обойтись без них.
Да это как бы не сильно важно. Компилятор или стандартная библиотека — результат все равно жесткий.
и малость офигел — это вот так вот легко можно получить 80 сек на банальнейшей инициализации листа всего-то 8000 элементами. GIV>>Жесть. А 10 секунд на это же самое терпимо.
CC>Я право не знаю даже как автору удалось получить такой удивительный результат.
Может он конечно умолчал о чем то...
CC>вывод: CC>
Здравствуйте, frogkiller, Вы писали:
F>В случае аллокации на стеке получаем помимо создания ещё конструктор копироания, а потом и деструктор. Имхо, это более тяжкий случай.
Нормальный компилер это всё выкинет задействовав RVO.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, пыщьх, Вы писали:
П>>Всё, меняем std::string на FixedSizeString<Необходимый_Размер> и имеем стопроцентный сиплюсплюсный аналог char szXXX[размер] = "test". П>Плюс, если там вектор поюзан с поэтапным добавлением элементов без вызова reserve()...
Автор утверждает что там list
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Aleх, Вы писали:
A>Тут С++ ни при чем. Дело в реализации стандартной библиотеки. Хороших реализаций я не видел. Хотите быстро, пишите свою реализацию строки (ну и списка). Контейнеры в STL сделаны поразительно голимо. Хотя бы потому что там куча грязных хаков, макросов, где можно спокойно обойтись без них.
Встану на защиту кода стандартной библиотеки, потому что видел ее внутреннее устройство —
код там написан очень тщательно.
Кстати, многими попытки переплюнуть std::string по скорости уже предпринимались.
Ничего особо путного, кроме нескольких велосипедов, из этого не вышло.
Вы говорите про какие конкретно реализации STL ? Dinkumware, STLPort или SGI ?
Здравствуйте, GarryIV, Вы писали:
П>>Что C++ тут непричём... GIV>Угу, конечно. Я даже на скиптовых языках не знаю как такой результат получить.
Скомпилировать интерпретатор без оптимизации. Будет тот же результат. Не в языке дело, а в способе использования.
GIV>А то, что тут есть что оптимизировать даже тому топикстартеру понятно.
В любой нетривиальной программе всегда есть, что оптимизировать.