Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

В погоне за скоростью

Автор Алексей Гринь, июля 25, 2009, 22:55

0 Пользователи и 1 гость просматривают эту тему.

oort

А если еще учесть чуть ли не тот же экспоненциальный рост кода при простом использовании ООП... В общем, если программа влезет в память, она будет выполняться быстро. :)

Алексей Гринь

Цитата: oort от июля 27, 2009, 11:54
А если еще учесть чуть ли не тот же экспоненциальный рост кода при простом использовании ООП...
В смысле кода — исходного или бинарного?
В смысле писанины букв руками чрезмерное увлечение ООПом приводит к огромному количеству бессмысленных интерфейсов, фабрик, взаимосвязей и т. д.
В смысле генерируемого кода, С++-таки генерит очень шустрый код.
肏! Τίς πέπορδε;

oort

Шустрый. Но огромный количеством -- именно за счет фабрик, взаимосвязей, переходников и пр.

Gerbarius

Алексей, у вас пример с грубыми ощибками.
1) Почему-то у вас в функции  rfc_func_variant_yesX_noZ стоит условие if(o->x < 30) вместо if(o->x) как в основной функции. С учётом того, что x вы ставите в 100, это имеет значение.
2) Но эта функция у вас даже и не вызывается из-за другой ошибки. В "мегапродвинутом" варианте вы вызываете map_rfc_func(false, true) вместо map_rfc_func(true, false). Тем самым, хотя вы обнуляете z, но не x, вызывается функция rfc_func_variant_noX_yesZ.

Исправьте ошибки и замерьте время заново. Результаты вас удивят.  :)

Алексей Гринь

Хм, я этого и боялся. Посмотрим.

Зато знаю теперь, что хоть кто-то сомтрит вложения Ж)
肏! Τίς πέπορδε;

Алексей Гринь

Да, туповато вышло. Перепутал местами всего-то false и true, а вышло так драматично (замена o->x < 30 на o->x абсолютно ничего не изменила).

Но я не унываю, потому что с учётом исправлений в среднем у меня выходит так:
ЦитироватьPolymorph.: 10140 ms
Plain code: 10219 ms

:)

Тем более что тест не то, чтобы тщательно продуманный, так, эссэ.
Теоретически единственный оверхед — маппинг нужной функции + последующий дереференсинг функции каждый раз. Если есть возможность таким методом вырезать нечто, куда большее по трудозатратом, чем это - оно оправдано (правда, надо посмотреть скорость маппинга для 40 полей... ужость. Слава богу что он происходит только раз, при записи, а не при чтении).
肏! Τίς πέπορδε;

Алексей Гринь

Int to String в куче итераций:

Первый пришедший в голову вариант:
  char buff[32];
  sprintf(buff, "%d", self);

1340 мс

Вторый пришедший в голову вариант через не везде имеющуюся функцию itoa:
  char buff[32];
  itoa(self, buff, 10);

970 мс

Немного подумав:
    char buff[16];
    char* ptr = buff + 15;

    bool neg = (n < 0);

    if(neg)
        n = -n;

    *ptr-- = 0;

    do
    {
        *ptr-- = (n % 10) + '0';
        n /= 10;
    }
    while(n);

    if(neg)
        *ptr-- = '-';

char* result = ++ptr;

930-950 мс

Развернул цикл в предыдущем примере в goto'ы:
   again:
    {
        *ptr-- = (n % 10) + '0';
        n /= 10;
    }
    if(n)
        goto again;

900-920 мс


Как бы ещё ускориться... :???
肏! Τίς πέπορδε;

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр