Используя внутренние статические переменные для увеличения производительности?

В то время как способом дразнить jdbc в Вашем приложении является, конечно, иждивенец о том, как Вы реализовали свои фактические jdbc транзакции.

, Если бы Вы используете jdbc как есть, я предположил бы, что Вы записали себе служебный своего рода класс, чтобы сделать некоторые задачи в строке DBUtils.getMetadataFor(String tablename). То, что это означало бы, - то, что необходимо было бы создать насмешку для того класса, и это могло быть всем, в чем Вы нуждаетесь. Это было бы довольно легким решением для Вас, так как у Вас, по-видимому, уже есть серия связанных доступных фиктивных объектов jdbc. Обратите внимание, что я предполагаю, что Ваш код jdbc не взорван все вокруг приложения - если это, осуществите рефакторинг!!!

, Если Вы однако используете какую-либо платформу для обработки базы данных (как Шаблонные классы Платформы Spring JDBC) Вы можете и должны дразнить интерфейсное использование класса EasyMock или некоторый другой эквивалент. Тем путем можно иметь всю власть в мире, требуемом для легкой насмешки соединения.

И в последний раз если ничто иное не работает, можно сделать то, что другие уже сказали и используют DBUnit и/или дерби.

8
задан groovingandi 29 September 2009 в 11:24
поделиться

8 ответов

Нет никакой разницы. Не требуется никакого кода для «создания» неинициализированного массива.

В случае статического массива память зарезервирована и доступна все время. В случае автоматического массива он находится в стеке, и все, что требуется для его «создания», - это переместить указатель стека, что в любом случае произойдет при входе в функцию.

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

16
ответ дан 5 December 2019 в 04:58
поделиться

Я бы определенно сначала написал его самым простым и читаемым способом. Один раз в миллисекунду звучит как очень редко выполняемая функция для микрооптимизации.

Как только она заработает, протестируйте ее. Решите, достаточно ли хороша производительность. Если это не так, произведите оптимизацию и снова выполните тест. Не искажайте чистый код без очень твердых цифр, подтверждающих ваше решение.

10
ответ дан 5 December 2019 в 04:58
поделиться

Как обычно, сначала необходимо выполнить профилирование. Локальные переменные, вероятно, только заставят указатель стека немного декрементироваться, что не должно приводить к снижению производительности.

5
ответ дан 5 December 2019 в 04:58
поделиться

Вы пытаетесь выполнить микрооптимизацию без тестирования производительности, что обычно считается плохим. Вы всегда должны тестировать. В противном случае, как вы узнаете наверняка, что любая попытка оптимизации сработала?

Маловероятно, что это принесет вам пользу, поэтому читаемость кода и удобство обслуживания должны быть на первом месте.

2
ответ дан 5 December 2019 в 04:58
поделиться

Распределение переменных стека не похоже на выделение переменных кучи. Все, что происходит, - это смещение указателя стека вниз достаточно далеко, чтобы выделить всю память, необходимую для функции. Нет накладных расходов при размещении одной или ста переменных в кадре стека. Указатель стека уже будет перемещен при вызове функции, даже если есть нулевые переменные (для записи, куда вернуться и т. Д.)

2
ответ дан 5 December 2019 в 04:58
поделиться

Единственный способ узнать это - попробовать и протестировать. Однако вряд ли это будет иметь большое значение.

1
ответ дан 5 December 2019 в 04:58
поделиться

На 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 для инициализации массивов.

1
ответ дан 5 December 2019 в 04:58
поделиться

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

Что может повредить производительности, так это эти выделенные в стеке переменные должны быть адресованы относительно стека или базового указателя, поэтому использование static может немного улучшить производительность.

Как всегда, протестируйте код, чтобы убедиться в этом.

0
ответ дан 5 December 2019 в 04:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: