В настоящее время я занимаюсь оптимизацией кода численного анализа. В коде есть таблица поиска элементов размером 200x150 (в настоящее время статическая std::vector <std::vector<double>> ), которая создается в начале каждого запуска. На самом деле построение интерполяционной таблицы довольно сложное — значения в интерполяционной таблице строятся с использованием итеративного метода секущих на сложном наборе уравнений. В настоящее время для моделирования построение таблицы поиска занимает 20% времени выполнения (время выполнения составляет порядка 25 секунд, построение таблицы поиска занимает 5 секунд). Хотя 5 секунд могут показаться не такими уж большими, при запуске наших симуляций MC, где мы запускаем более 50 000 симуляций, они внезапно становятся большим отрезком времени.
Наряду с некоторыми другими идеями, одна вещь, которая была поднята, — можем ли мы построить эту таблицу поиска, используя шаблоны во время компиляции? Сама таблица никогда не меняется. Жесткое кодирование большого массива не является поддерживаемым решением (уравнения, которые используются для создания таблицы, постоянно корректируются), но кажется, что если таблицу можно сгенерировать во время компиляции, это даст нам лучшее из обоих миров. (легко поддерживать, без накладных расходов во время выполнения).
Итак, я предлагаю следующий (значительно упрощенный) сценарий. Допустим, вы хотите сгенерировать статический массив (используйте любой контейнер, который вам больше всего подходит — 2D-массив c, вектор векторов и т. д.) во время компиляции. У вас есть определенная функция-
double f(int row, int col);
где возвращаемое значение — это запись в таблице, row — строка таблицы поиска, а col — столбец таблицы поиска. Можно ли сгенерировать этот статический массив во время компиляции с использованием шаблонов и как?