Сравнение кода - PullRequest
       30

Сравнение кода

1 голос
/ 09 мая 2011

Какой из следующих двух фрагментов кода должен быть предпочтительнее другого? и на каком основании решение должно приниматься вообще?

MAX_LIMIT может варьироваться от 1000 до 5000 при различных вызовах этой функции.

for (i=0;i<MAX_LIMIT;++i)
{
    for (j=0;j<MAX_LIMIT;++j)
    {
         anObj.setMatrix(i,j,0);
    }
}
for (i=0;i<MAX_LIMIT;++i)
{
    anObj.setMatrix(i,i,1);
}

против

for (i=0;i<MAX_LIMIT;++i)
{
    for (j=0;j<MAX_LIMIT;++j)
    {
         if(i==j)
         {
             anObj.setMatrix(i,j,1);
         }
         else
         {
             anObj.setMatrix(i,j,0);
         }
    }
}

Спасибо.

Ответы [ 4 ]

4 голосов
/ 09 мая 2011

Исполнение двух должно быть асимптотически равным, так как оба выполняются в O (n ^ 2). Вы, вероятно, должны предпочесть тот, который наиболее удобочитаем.

3 голосов
/ 09 мая 2011

Второй, который делает то, что говорит.Тем не менее, я бы настоятельно предпочел

for (i=0;i<MAX_LIMIT;++i)
{
    for (j=0;j<MAX_LIMIT;++j)
    {
         anObj.setMatrix(i, j, i==j ? 1 : 0);
    }
}
1 голос
/ 09 мая 2011

По-моему, я бы пошел со вторым из двух.Лучше всего ограничить количество циклов.Поскольку вы смотрите хотя бы на O (n ^ 2) времени выполнения, я бы определенно ограничил себя только двумя циклами.

0 голосов
/ 09 мая 2011

Лучше для чего?Я думаю, что вторую версию легче понять с первого взгляда, хотя у других людей могут быть другие мнения.

Если вы заинтересованы в производительности, должно быть легко выбрать время для двух методов.(Это может даже иметь значение.)

Если посмотреть на это с точки зрения производительности, я подозреваю, что второй метод будет быстрее, поскольку он будет работать через массив по одной строке кэша за раз.Первый метод будет работать через массив по одной строке кэша за раз, а затем выполнять N ошибок кэша.Я предполагаю, что это более важно, чем помещать в цикл дополнительные условные выражения.

Итак, если инициализация массива занимает значительное время по сравнению с другими операциями, и это имеет значение, время каждой из них и посмотреть.Если нет, то перейдите на более читаемую версию.

...