loop over a very long container (millions elements)
{
each element compute 8 integers: k1,k2,k3,...,k8
call function func(k1,k2,k3,...,k8)
}
container is a std::vector, element is a long integer
each k can only take {0,1,2,..5} six values.
func is a simple expression of complex number calculation,
involves std::conj and std::exp
Чтобы ускорить работу, я кэширую все возможные результаты функции func в массив и вместо этого вызываю func_array [k1] [k2] [k3].... Но если просто определить func_array как: std:: complex func_array [6] [6] [6]..., программа умирает при переполнении стека.
Какие-нибудь лучшие решения для ускорения?
Если функция func() всегда возвращает одно и то же значение для заданного набора входов (например, не зависит от времени, зависит от последовательности и т.д.), вы можете сделать следующее:
1. Всякий раз, когда вы вызываете func(), сохраните результат в кеш [используя значения k1... через k8 в качестве ключа к записи кэша]
2. Перед вызовом функции func() проверьте, есть ли у вас значение кэшированного значения
Кэш сам по себе может быть Картой, где вы строите ключ, объединяя k1... thru... k8 в некотором роде, который подходит для их типа данных.
Вы создаете массив std::complex[6][6]...[6]
на
стек? Во-первых, это может привести к переполнению стека: это
довольно большой массив для множества стеков. И второе: если вы создаете
он в стеке, он будет повторно инициализироваться каждый раз, когда вы вызываете
функция. Вероятно, вам нужен локальный статический массив, который
будет инициализирован один раз (первый раз, когда он встречается), и
затем сохраните его значение между вызовами функций.
static std::complex func_array[6][6][6][6][6][6][6][6] = {0};
тогда внутри метода класса?