LINUX.ORG.RU

Выполнение по условию (общий вопрос)


0

1

Помню в 10-11 классе в школе увлекался книгой Гука об архитектуре микропроцессоров, и вычитал там о спекулятивной обработки команд процессором, т.е. он предполагает что истинное условие выполняется чаще ложного и заранее загружает в конвейер команды, которые следует выполнять при истинности условия.

После этого код я стал писать подбирая условия так, чтобы они сработали чаще ложных (т.е. были желательными):

if (condition1_is_true) {
   .. // do_something
   if (condition2_is_true) {
      ...
      if (conditionN_is_true) {
          ...
          return true;
      }
   }
}

return false;

Собственно, теперь вопрос, который всегда боялся спросить у взрослых: является ли такой метод оптимизации обоснованным (так как на практике он менее читабелен нежели обычный):

if (condition1_is_true)
   .. // do something
}

if (!condition2_is_true) {
   return false;
}

... 

if (conditionN_is_true) {
   ...
   return true;
}

return false;


Компилятор всё равно превратит это в кучу разных условий, как ложных, так и истинных, так что, на высоком уровне заморачиваться не стоит.

Dragon59 ★★
()

Если у тебя более трёх уровней вложения - подумай о том, чтобы разбить процедуру на несколько меньших. Таких пирамид и лестниц условий быть не должно в коде в приципе.

schizoid ★★★
()

Если у процессора нет статистики о данном ветвлении, то предполагается, что переходы назад выполняются, а переходы вперёд не выполняются.

geekless ★★
()

Дополнительные уровни вложенности - зло. Код читается в несколько раз чаще, чем пишется, поэтому обычно его пишут для людей. Компилятор - он машина, он любой венигрет разберет и произведет нужные оптимизации в случае необходимости. А вот человеку должно быть удобно.

m0rph ★★★★★
()

ИМХО стоит использовать только в критических местах и 2х случаях:

1. Есть знание, что конкретный компилятор дубовый и перемешивать код не умеет
2. Либо, есть возможность указывать явно, как в GCC: http://zeta-puppis.com/2006/02/09/likelyunlikely-gcc-extensions/ (частенько можно встретить в ядре)

user_2190
()
Ответ на: комментарий от m0rph

не указан исп. яп
если он дополз до сишечки то говорить о читаемости поздно
надо упирать на оптимизацию

anonymous
()
Ответ на: комментарий от m0rph

> Дополнительные уровни вложенности - зло.

А как вам такое?

(defun do-some-output (stream)
  ;; Do some pending output; return T if completed, NIL if more to do
  (with-stream-class (simple-stream stream)
    (let ((fd (sm output-handle stream)))
      (loop
        (let ((list (pop (sm pending stream))))
          (unless list
            (sb-sys:remove-fd-handler (sm handler stream))
            (setf (sm handler stream) nil)
            (return t))
          (let* ((buffer (first list))
                 (start (second list))
                 (end (third list))
                 (len (- end start)))
            (declare (type simple-stream-buffer buffer)
                     (type sb-int:index start end len))
            (tagbody again
               (multiple-value-bind (bytes errno)
                   (sb-sys:with-pinned-objects (buffer)
                     (sb-unix:unix-write fd (buffer-sap buffer) start len))
                 (cond ((null bytes)
                        (if (= errno sb-unix:eintr)
                            (go again)
                            (progn (push list (sm pending stream))
                                   (return nil))))
                       ((< bytes len)
                        (setf (second list) (+ start bytes))
                        (push list (sm pending stream))
                        (return nil))
                       ((= bytes len)
                        (free-buffer buffer)))))))))))

11 уровней вложенности.

Одиннадцать.

anonymous
()
Ответ на: комментарий от schizoid

Если у тебя более трёх уровней вложения - подумай о том, чтобы разбить процедуру на несколько меньших. Таких пирамид и лестниц условий быть не должно в коде в приципе.

Авторы вышеприведённого кода смотрят на тебя, как на быдло.

anonymous
()

Вообще то от задачи зависит, скажем у нас на такие глупости никто не заморачивается, все равно все упирается в доступ к памяти.

AIv ★★★★★
()
if (condition) {
   do_something();
}

может скомпилироваться примерно так:

if (! condition) goto end;
do_something();
end:
и твоя оптимизация станет прямо противоположной. Если хочешь оптимизировать на это уровне - только __likely подсказки компилятору.

Legioner ★★★★★
()
Ответ на: комментарий от anonymous

11 уровней вложенности.

Одиннадцать.

Хотя сейчас лиспоеды начнут кричать, что я в этом ничего не смыслю, на мой взгляд - полная жесть.

m0rph ★★★★★
()
Ответ на: комментарий от anonymous

Вполне обычный высер лиспера.

anonymous
()

В современных процессорах довольно сложные алгоритмы branch prediction. Последние штеуды, вроде как, умеют даже определять простые последовательности вроде true-false-true-false. Так что, такой подход актуален только для довольно старых процессоров. И то, логичнее оптимизировать алгоритм, чтобы ветвления как можно чаще срабатывали _одинаково_, а не каким-то определенным образом.

rand
()

Писатькод надо так чтоб было удобно самому + можно было легко разобраться другим.

observer ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.