Чтение значения из локальной переменной или из объекта в циклах for и if? - PullRequest
2 голосов
/ 22 ноября 2011

В цикле for в C #, какой из следующих кодовых блоков является лучшим с точки зрения производительности?Или нет разницы?Разница заключается в том, сохраняется ли условие в локальной переменной или считывается непосредственно из объекта.

Опция 1

float maxDepth = 0;
int maxnumber = 0;

for (int i = 0; i < defects.Total; i++)
{
    if (defects[i].Depth > maxDepth)
    {
        maxDepth = defects[i].Depth;
        maxnumber = i;
    }
}

Опция 2

float maxDepth = 0;
int maxnumber = 0

int defectNumber = defects.Total;
for (int i = 0; i < defectNumber; i++)
{
    if (defects[i].Depth > maxDepth)
    {
        maxDepth = defects[i].Depth;
        maxnumber = i;
    }
}

Яизвините, если этот вопрос задавали много, но я нигде не смог его найти.

Андерс

Ответы [ 4 ]

2 голосов
/ 22 ноября 2011

Для всех таких вопросов вы можете использовать System.Diagnostics.Stopwatch вот так.

var stopwatch = new Stopwatch();
stopwatch.Start();

float maxDepth = 0; 
int maxnumber = 0;  
for (int i = 0; i < defects.Total; i++) 
{    
    if (defects[i].Depth > maxDepth)     
    {         
        maxDepth = defects[i].Depth;         
        maxnumber = i;     
    } 
} 

stopwatch.Stop();
Debug.WriteLine("Elapesed time for method 1: {0} msec.", stopwatch.ElapsedMilliseconds);
stopwatch.Reset();
stopwatch.Start();

maxDepth = 0; 
maxnumber = 0;  
int defectNumber = defects.Total; 
for (int i = 0; i < defectNumber; i++)     
{    
    if (defects[i].Depth > maxDepth)     
    {         
        maxDepth = defects[i].Depth;         
        maxnumber = i;     
    } 
} 
stopwatch.Stop();
Debug.WriteLine("Elapesed time for method 2: {0} msec.", stopwatch.ElapsedMilliseconds);

Тогда вы получили точную информацию. (Лучший способ - сделать несколько прогонов и использовать среднее значение)

0 голосов
/ 22 ноября 2011

Я не думаю, что это имеет значение много , когда дело доходит до производительности, однако я использую второй вариант для лучшего наблюдения за кодом, упрощения отладки и читаемости, как показано ниже:

float maxDepth = 0; 
int maxNumber = 0 

int defectNumber = defects.Total; 
for (int i = 0; i < defectNumber; i++) 
{ 
    float defectsCurrentDepth = defects[i].Depth;
    if (defectsCurrentDepth > maxDepth) 
    { 
        maxDepth = defectsCurrentDepth; 
        maxNumber = i; 
    } 
} 
0 голосов
/ 22 ноября 2011

Вариант 2 будет использовать чуть-чуть больше памяти, но это будет чуть-чуть быстрее из-за одного шага разыменования.

В любом случае не будет большой разницы, если вы не вычислите более миллиардов + итераций.

0 голосов
/ 22 ноября 2011

Ваш первый пример должен продолжать устранять дефекты. Итого при каждом прохождении цикла. В общем, это будет медленнее, чем значение в нативном int. У меня нет знаний о внутренней работе C #, поэтому я не могу с уверенностью сказать, что быстрее или насколько, но в целом я бы сказал, что второй способ лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...