Для переменной, используемой в функции, которая называется очень часто и для реализации в J2ME на ежевике (если это что-то изменило, вы можете объяснить)?Какой способ объявления переменной быстрее всего?
class X {
int i;
public void someFunc(int j) {
i = 0;
while(i < j){
[...]
i++;
}
}
}
или
class X {
static int i;
public void someFunc(int j) {
i = 0;
while(i < j){
[...]
i++;
}
}
}
или
class X {
public void someFunc(int j) {
int i = 0;
while(i < j){
[...]
i++;
}
}
}
Я знаю, что есть разница, как доступ к статическим по сравнению с не-статической переменной класса, но я не знаю, что это повлияет скорость. Я также помню, где-то читал, что в функциональных переменных можно получить доступ быстрее, но я не знаю, почему и где я это читал.
Справочная информация по вопросу: некоторые функции рисования в играх называются чрезмерно часто, и даже небольшая разница в времени доступа может влиять на общую производительность, когда переменная используется в довольно большом цикле.
Update
I установка небольшой тест (код ниже) и запустил его на реальном устройстве, чтобы увидеть, что результаты похожи. Я выполнил 10000 вызовов функции, которая за 10000 раз переходила к переменной.
- если переменная была в-функции потребовалось ~ 9250 мс для запуска
- если переменная принадлежит к классу, потребовалось ~ 21700 мс запустить
- если переменная принадлежит к классу, но был static it tool ~ 210000 мс для запуска.
Я не знаю, насколько актуальны результаты теста, если они будут проводиться в реальной программе и если в игре нет другого внешнего фактора. Но, предполагая, что они это делают, поскольку он соответствует наиболее часто просматриваемому представлению здесь, тогда существует значительная разница между временами доступа.
Опасается ли это преждевременной оптимизации? Возможно, но также полезно использовать как можно больше функциональной переменной. Даже копирование переменной класса в функциональную, похоже, может повлиять на время выполнения.
final static int MAX = 10000;
private void runTest()
{
long startTime = System.currentTimeMillis();
for(int count = 0; count < MAX; count++)
test1(MAX);
test1.setText(""+(System.currentTimeMillis()-startTime));
startTime = System.currentTimeMillis();
for(int count = 0; count < MAX; count++)
test2(MAX);
test2.setText(""+(System.currentTimeMillis()-startTime));
startTime = System.currentTimeMillis();
for(int count = 0; count < MAX; count++)
test3(MAX);
test3.setText(""+(System.currentTimeMillis()-startTime));
}
void test1(int j)
{
int i = 0;
while(i < j)
{
i++;
}
}
int i2;
void test2(int j)
{
i2 = 0;
while(i2 < j)
{
i2++;
}
}
static int i3;
void test3(int j)
{
i3 = 0;
while(i3 < j)
{
i3++;
}
}
Преждевременная оптимизация. – Robin
Согласитесь с Робин. Особенно, если картина является узким местом, объявление переменной по-другому не будет вашей серебряной пулей. –
Ваш тест испорчен, поскольку test3 запускается после теста2, который запускается после теста1. test1, возможно, разогрел кеш-тест2, а test3 оказался быстрее. Вы должны запускать их в независимых прогонах. –