В настоящее время используются быстрые компьютеры, и уже никто не задумывается о том, чтобы оптимизировать скорость арифметических операций. А ведь были времена 286-х процессоров, когда операции с плавающей запятой выполнялись медленно даже при наличии арифметического сопроцессора (дополнительный чип, служил для выполнения операций над дробными числами). Без такого сопроцессоpa компьютер значительно терял в скорости. Одними из наиболее чувствительных к математическим операциям оказались ЗО-игры. Именно здесь были сложные расчеты, и математика должна была работать очень быстро. Несмотря на это, мир увидел Wolfstain 3D и Doom даже на слабых компьютерах.

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

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

В высокоуровневых языках многие из этих операций недоступны. Например, нельзя эффективно управлять регистрами без ассемблерных вставок, которые усложняют программирование. Но, несмотря на это, в Delphi можно использовать некоторые приемы.

Сдвиги работают быстрее, чем умножение или деление. Если нужно разделить число на два, то надо сдвинуть число на 1 бит вправо. Например, операция

Result := Param/2:

эквивалентна

Result := Paraml shr 1:

только вторая операция использует сдвиг и работает быстрее.

Оператор X shr Y сдвигает число X вправо Y раз. Если надо произвести сдвиг на 5 единиц, то пишем 52 shr 5. Для понимания принципа работы нужно представить число в двоичной системе. Допустим, нам нужно разделить число 52 на 2. Число 52 в двоичной системе выглядит как 110100. Теперь сдвигаем это число вправо (убираем последний 0), и получается число 11010, что соответствует 26. Это и есть число 52, разделенное на 2.

Почему так происходит? Представим десятичную систему. Когда нам нужно разделить число 520 на 10, то мы просто сдвигаем число вправо, то есть убираем последний ноль и получаем результат - 52. Таким образом, легко запомнить, что в десятичной системе при сдвиге числа вправо мы делим его на 10, а в двоичной системе при сдвиге вправо число делится на 2. То же самое и с остальными системами счисления. В шестнадцатеричной системе при сдвиге вправо происходит деление на 16.

Для деления числа 520 на 100 нам надо дважды сдвинуть число вправо, то есть с правой стороны убрать два числа. Результатом будет 5 (точнее сказать, 5.2, но десятичная часть отбрасывается). То же самое в двоичной системе счисления. Если нужно разделить на 4, то дважды сдвигаем число вправо - 52 shr 2. Для деления на 8 нужно сдвинуть число трижды - 52 shr 3.

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

Аналогично осуществляется процесс умножения. Операция сдвига числа влево shl работает быстрее умножения. Если вам надо умножить число 15 на 2, то лучше написать так:

Result := 15 shl 1:

В десятичной системе при умножении числа на 10 сдвигаем его влево, добавляя справа 0. Например, для умножения числа 15 на 10 мы добавляем справа 0 и получаем 100.

Точно также и со сдвигом в двоичной системе. Число 15 в двоичной системе записывается как 1111. Если добавить справа 0, то получим число 11110, что соответствует 30.

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

2.15.1. Разрыв цепочек || Оглавление || 2.17. Необходимая достаточность


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31