Для переменной, используемой в функции, которая вызывается очень часто, и для реализации в 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++;
}
}
}
Я знаю, что есть разница, как осуществляется доступ к статической и нестатической переменной класса, но я не знаю, что это повлияет на скорость. Я также помню, как читал где-то, что внутри-функциональные переменные могут быть доступны быстрее, но я не знаю, почему и где я это прочитал.
Справочная информация по вопросу: некоторые функции рисования в играх вызываются слишком часто, и даже небольшая разница во времени доступа может повлиять на общую производительность, когда переменная используется в большом цикле.
Обновление
Я установил небольшой тест (код ниже) и запустил его на реальном устройстве, чтобы посмотреть, на что похожи результаты. Я выполнил 10000 вызовов функции, которая зациклилась 10000 раз, обращаясь к переменной.
- если переменная была в рабочем состоянии, для запуска
- если переменная принадлежала классу, для запуска * 1023 потребовалось ~ 21700 мс *
- , если переменная принадлежала классу, но была статической, для ее запуска требовалось ~ 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++;
}
}