Сколько примитивных операций в простом цикле? - PullRequest
0 голосов
/ 21 февраля 2011

У меня есть куча кода для поиска примитивных операций. Дело в том, что в Интернете не так много подробных ресурсов на эту тему. В этом цикле:

for i:=0 to n do
  print test
end

Сколько шагов у нас на самом деле? В своем первом предположении я бы сказал, что n + 1, учитывая n для циклов и 1 для печати. Тогда я подумал, что, возможно, я не достаточно точен. Разве нет операции даже для добавления 1 к i в каждом цикле? В этом отношении мы имеем n + n + 1 = 2n + 1. Это правильно?

1 Ответ

4 голосов
/ 21 февраля 2011

Цикл можно разбить на его «примитивные операции», повторно приведя его к виду while:

int i = 0;
while (i < n)
{
    print test;
    i = i + 1;
}

Или, более точно:

loop:
    if (i < n) goto done
    print test
    i = i + 1
    goto loop
done:

Youзатем можно увидеть, что для каждой итерации есть сравнение, приращение и goto.Это просто накладные расходы.Вы должны добавить к этому все, что делается в цикле.Если print считается «примитивной операцией», то у вас есть:

  • n + 1 сравнений
  • n вызовов с шагом print
  • n
  • n + 1 goto инструкции (одна из которых разветвляется из цикла после завершения)

Теперь то, как все это преобразуется в машинный код, сильно зависит от компилятора,библиотека времени выполнения, операционная система и целевое оборудование.И, возможно, другие вещи.

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