Прежде всего, вы не забыли сказать своему компилятору оптимизировать?
И отключить медленную проверку границ индекса массива и тому подобное?
После этого вы получите существенное ускорениепредставляя ваши двоичные значения в виде отдельных битов, поскольку вы можете устанавливать или сбрасывать, скажем, 32 или 64 бита за раз.
Также я бы предположил, что динамическое распределение даст значительную долю служебных данных, нопо-видимому, вы измерили и обнаружили, что это не так.Однако, если управление памятью действительно вносит значительный вклад во время, решение зависит в некоторой степени от схемы использования.Но, возможно, ваш код генерирует стековое поведение alloc / free, и в этом случае вы можете оптимизировать распределение практически до нуля;просто выделите большой кусок памяти в начале, а затем выделите из него подобный стеку
Учитывая ваш текущий код:
void place(char* bin, int* best, int width)
{
for (int i=best[0]; i<best[0]+best[1]; i++)
for (int j=best[2]; j<best[2]+best[3]; j++)
bin[i*width+j] = 'x';
}
Из-за возможного наложения псевдонимов компилятор может не реализоватьнапример, best[0]
будет постоянным во время цикла.
Итак, скажите ему:
void place(char* bin, int const* best, int const width)
{
int const maxY = best[0] + best[1];
int const maxX = best[2] + best[3];
for( int y = best[0]; y < maxY; ++y )
{
for( int x = best[2]; x < maxX; ++x )
{
bin[y*width + x] = 'x';
}
}
}
Скорее всего, ваш компилятор выведет вычисление y*width
из внутреннего цикла, нопочему бы не сказать ему, сделайте также, что:
void place(char* bin, int* best, int const width)
{
int const maxY = best[0]+best[1];
int const maxX = best[2]+best[3];
for( int y = best[0]; y < maxY; ++y )
{
int const startOfRow = y*width;
for( int x = best[2]; x < maxX; ++x )
{
bin[startOfRow + x] = 'x';
}
}
}
Эта ручная оптимизация (также применяемая к другой процедуре) может или не может помочь, это зависит от того, насколько умен ваш компилятор.
Далее,если это не поможет, рассмотрите возможность замены внутреннего цикла на std::fill
(или memset
), сделав целый ряд одним махом.
И если это не помогает или не помогаетдостаточно переключиться на представление на битовом уровне.
Возможно, стоит отметить и попробовать, что каждый ПК имеет встроенную аппаратную поддержку для оптимизации операций на битовом уровне, а именно карту графического ускорителя (в старыхвремена называются бличип ттер).Таким образом, вы можете просто использовать библиотеку изображений и черно-белое растровое изображение.Но так как ваши прямоугольники маленькие, я не уверен, что издержки установки перевесят скорость фактической операции - нужно измерить.; -)
Приветствия & hth.,