В то время как способом дразнить jdbc в Вашем приложении является, конечно, иждивенец о том, как Вы реализовали свои фактические jdbc транзакции.
, Если бы Вы используете jdbc как есть, я предположил бы, что Вы записали себе служебный своего рода класс, чтобы сделать некоторые задачи в строке DBUtils.getMetadataFor(String tablename)
. То, что это означало бы, - то, что необходимо было бы создать насмешку для того класса, и это могло быть всем, в чем Вы нуждаетесь. Это было бы довольно легким решением для Вас, так как у Вас, по-видимому, уже есть серия связанных доступных фиктивных объектов jdbc. Обратите внимание, что я предполагаю, что Ваш код jdbc не взорван все вокруг приложения - если это, осуществите рефакторинг!!!
, Если Вы однако используете какую-либо платформу для обработки базы данных (как Шаблонные классы Платформы Spring JDBC) Вы можете и должны дразнить интерфейсное использование класса EasyMock или некоторый другой эквивалент. Тем путем можно иметь всю власть в мире, требуемом для легкой насмешки соединения.
И в последний раз если ничто иное не работает, можно сделать то, что другие уже сказали и используют DBUnit и/или дерби.
Нет никакой разницы. Не требуется никакого кода для «создания» неинициализированного массива.
В случае статического массива память зарезервирована и доступна все время. В случае автоматического массива он находится в стеке, и все, что требуется для его «создания», - это переместить указатель стека, что в любом случае произойдет при входе в функцию.
(И однажды вы Я попробую использовать эту функцию в многопоточной программе, и у статической версии будут периодические периодические сбои, которые заставят вас пить и принимать наркотики. Это просто не стоит риска.)
Я бы определенно сначала написал его самым простым и читаемым способом. Один раз в миллисекунду звучит как очень редко выполняемая функция для микрооптимизации.
Как только она заработает, протестируйте ее. Решите, достаточно ли хороша производительность. Если это не так, произведите оптимизацию и снова выполните тест. Не искажайте чистый код без очень твердых цифр, подтверждающих ваше решение.
Как обычно, сначала необходимо выполнить профилирование. Локальные переменные, вероятно, только заставят указатель стека немного декрементироваться, что не должно приводить к снижению производительности.
Вы пытаетесь выполнить микрооптимизацию без тестирования производительности, что обычно считается плохим. Вы всегда должны тестировать. В противном случае, как вы узнаете наверняка, что любая попытка оптимизации сработала?
Маловероятно, что это принесет вам пользу, поэтому читаемость кода и удобство обслуживания должны быть на первом месте.
Распределение переменных стека не похоже на выделение переменных кучи. Все, что происходит, - это смещение указателя стека вниз достаточно далеко, чтобы выделить всю память, необходимую для функции. Нет накладных расходов при размещении одной или ста переменных в кадре стека. Указатель стека уже будет перемещен при вызове функции, даже если есть нулевые переменные (для записи, куда вернуться и т. Д.)
Единственный способ узнать это - попробовать и протестировать. Однако вряд ли это будет иметь большое значение.
На SPARC, особенно в 64-битном режиме, статический регистр работает медленнее. Для доступа к глобальной переменной (которая является статической, это только имя, которое ограничено областью действия функции) требует 5 инструкций с использованием 3 регистров, в вашем случае 10 инструкций только для получения адреса массивов. Нестатическая версия, как уже указывалось, не имеет накладных расходов, поскольку фрейм создается в любом случае, если указатель стека увеличивается на 16 или 200 байтов, не имеет значения. Но будьте осторожны, если вы инициализируете свой массив, это может привести к скрытому memset, который может быть дорогостоящим.
void frequentlyCalledFunction(void)
{
double matrix1[10][10]={0.0};
double matrix2[10][10]={0.0};
/* do something with the matrices ... */
}
, вероятно, сделает 1 или 2 вызова memcpy или memset для инициализации массивов.
Резервирование места для переменных с автоматической продолжительностью хранения означает просто уменьшение указателя стека, так что пока это не единственные локальные переменные, накладных расходов не будет.
Что может повредить производительности, так это эти выделенные в стеке переменные должны быть адресованы относительно стека или базового указателя, поэтому использование static
может немного улучшить производительность.
Как всегда, протестируйте код, чтобы убедиться в этом.