LINUX.ORG.RU

Оптимизация циклов с массивами


0

4

Такие вещи вообще оптимизируются?

    for (i = 0; i < d3d_info->limits.vs_uniform_count; ++i)
    {
        if (stateblock->changed.vertexShaderConstantsF[i])
        {
            stateblock->contained_vs_consts_f[stateblock->num_contained_vs_consts_f] = i;
            ++stateblock->num_contained_vs_consts_f;
        }
    }

    for (i = 0; i < stateblock->num_contained_vs_consts_f; ++i)
    {
        unsigned int idx = stateblock->contained_vs_consts_f[i];

        TRACE("Setting vs_consts_f[%u] to {%.8e, %.8e, %.8e, %.8e}.\n", idx,
                src_state->vs_consts_f[idx * 4 + 0],
                src_state->vs_consts_f[idx * 4 + 1],
                src_state->vs_consts_f[idx * 4 + 2],
                src_state->vs_consts_f[idx * 4 + 3]);

        stateblock->state.vs_consts_f[idx * 4 + 0] = src_state->vs_consts_f[idx * 4 + 0];
        stateblock->state.vs_consts_f[idx * 4 + 1] = src_state->vs_consts_f[idx * 4 + 1];
        stateblock->state.vs_consts_f[idx * 4 + 2] = src_state->vs_consts_f[idx * 4 + 2];
        stateblock->state.vs_consts_f[idx * 4 + 3] = src_state->vs_consts_f[idx * 4 + 3];
    }

это wine/dlls/wined3d/stateblock.c

★★★★★

Последнее исправление: steemandlinux (всего исправлений: 1)

Крис Касперски - «Техника оптимизации программ. Эффективное использование памяти»

Книжка древняя, в чем-то не актуальная, но настоятельно рекомендуется к прочтению.

anonymous
()

А чё там оптимизировать-то. Во втором for итераций будет ровно столько, сколько посчитало в первом. Если ты второй for запихнёшь в первый if, то выиграешь минимум, а читаемость ухудшидся, имхо.

UVV ★★★★★
()

Не знаю, что тут даже оптимизировать.
объявление unsigned int idx вынести из цикла.
посчитать idx * 4 один раз, а не восемь.

хотя думаю, оптимизатор компилятора с таким и сам справится. но всё же.

по большому счёту - это экономия на спичках.

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от invy

по большому счёту - это экономия на спичках.

В некоторых играх ограничение этих циклов до 64 даёт прирост 40%, выше 64 цикла 99.9% - значение 0.

Одна из игр - WoT.

steemandlinux ★★★★★
() автор топика

i < d3d_info->limits.vs_uniform_count

Интересно: gcc оптимизирует это, или таки получим каждый раз разыменование указателя?

Я таких вещей никогда не допускаю, мало ли...

Eddy_Em ☆☆☆☆☆
()

stateblock->state.vs_consts_f[idx * 4 + 0] = src_state->vs_consts_f[idx * 4 + 0];

А зачем так делать? Какой размер у vs_consts_f? 64 бита или меньше? Если 64, то почему бы не использовать memcpy? Если меньше, то почему бы не расширить запись через 64-битные присваивания?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Интересно: gcc оптимизирует это, или таки получим каждый раз разыменование указателя?

Её никто не трогает - значит она const. Что ему помешает, если это не volatile?

Я таких вещей никогда не допускаю, мало ли...

А проверить, не?

Carb_blog7
()
Ответ на: комментарий от Carb_blog7

А проверить, не?

Ломает. Мне проще написать

int i, xx = trulala->trololo.gugugu;
for(i = 0; i < xx; i++) ...
, чтобы уж наверняка.

Ну и так же со сложными структурами:

type *ptr = some_struct->some_more->some_thing;
for(...){
...
  // действия с (*ptr++)
...
}

Ну, что я рукожопый, ты в курсе. Я и с массивами обычно через указатели работаю, если считаю, что так будет шустрей.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Питонщики иногда делают так, только у них вместо стрелки тоже точка. Но зачем делать так с gcc?

x3al ★★★★★
()
Ответ на: комментарий от x3al

Потому что я считаю, что так будет шустрей. А пхытон — это вообще жесть, у них там и преобразования типов через жопу, и с указателями проблема.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Carb_blog7

Её никто не трогает - значит она const. Что ему помешает, если это не volatile?

Не попробуешь — не узнаешь. Я сталкивался с случаем, когда gcc обращался к полю в структуре каждый раз. В тесном цикле вынос значения в локальную переменную дал прирост в несколько процентов, так что и париться особо не стоило.

i-rinat ★★★★★
()
Ответ на: комментарий от next_time

там же пейтон, не?

А я то думаю, что танки так тормозят.

devl547 ★★★★★
()
Ответ на: комментарий от invy

объявление unsigned int idx вынести из цикла.

Сомнительная оптимизация. Я ожидаю, что компилятор наоборот будет стремиться сократить эффективную область видимости переменной, чтобы по возможности ограничиться регистрами.

i-rinat ★★★★★
()
Ответ на: комментарий от ozkriff

одно использование питона делает кусок кода важным по производительности

next_time ★★★★★
()
Ответ на: комментарий от ozkriff

Питон же явно не в важных по производительности кусках кода используется :) .

Ну почему - иногда школьникам важно произвести впечатление, что им нужен новый комп.

Pavval ★★★★★
()
Ответ на: комментарий от Eddy_Em

и с указателями проблема.

неправда, нет указателей - нет проблемы

преобразования типов через жопу

не разжигай

MyTrooName ★★★★★
()

Может я чего-то не догоняю, но два цикла можно ж объединить. Или это небезопасно?

gh0stwizard ★★★★★
()
Ответ на: комментарий от carb_blog8

Да это с ВоТ в основном такая проблема была. Только вот новая версия упорно не хочет запускаться.

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от MyTrooName

нет указателей - нет проблемы

Ога, ога. Без указателей ЯП — не ЯП, а дерьмище!

не разжигай

Пхытон — порнуха, а не ЯП. Ни для чего он не годится! И это — факт!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от carb_blog8

Во запустил наконец-то.

Требуются новый wine, ie8, msvcr2012, msvcr2010, d3dx9_36.

Установщик:

http://worldoftanks.ru/ru/content/docs/update/

Демки:

http://wotreplays.ru/

Выхлоп вайна с дебагом:

https://drive.google.com/file/d/0B9uDUos4kbPua1FsN19heG0tSkU/edit?usp=sharing

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Без указателей ЯП — не С, а ЯВУ!

пофиксил

Пхытон — порнуха, а не ЯП. Ни для чего он не годится! И это — факт!

давай тоньше, так неинтересно

MyTrooName ★★★★★
()
Ответ на: комментарий от Eddy_Em

какая проблема?

$ python3
Python 3.4.1 (default, Aug 17 2014, 05:04:11)
[GCC 4.8.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> lib=ctypes.CDLL('libc.so.6')
>>> ptr=b'test'
>>> lib.printf(b'%s\n',ptr)
test
5

anonymous
()
Ответ на: комментарий от Eddy_Em

параметры printf имеют являются указателями. если бы были какие-то проблемы с указателями это бы не работало

anonymous
()
Ответ на: комментарий от Eddy_Em

тип printf можно явно задекларировать printf.argtypes=[c_char_p,c_char_p]

аргументы есть или нет

anonymous
()
Ответ на: комментарий от steemandlinux

Ну, врубил я твою херню. Выкрутил всё на максимум(что смог, улечшенная графика не ставится, вернее всё белое). У меня в среднем минимум 30фпс.

У меня встроенная в хасвелл видяха.

Выкати патч на свои «ограничения циклов».

carb_blog8
()
Ответ на: комментарий от Eddy_Em

Эдуард, вы дали пароль от лора своей дочурке? Я не верю, что взрослый человек может быть таким упоротым.

Virtuos86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.