Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2024, 00:39   #21
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,894
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Не думаю, что компилятор делает различие между двумя описаниями одного и того же действия.
В стародавние времена точно была разница. Но имхо уже достаточно давно машинный код будет одинаковый.
northener вне форума Ответить с цитированием
Старый 27.06.2024, 00:50   #22
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,640
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
По логике, там даже не будет вызова процедуры, а in-line вставка.
А inc это и не процедура по сути. Есть набор инструкций, которые выглядят как процедуры/функции, вызываются как процедуры/функции, но функциями не являются. Скорее языковые конструкции.
Arigato вне форума Ответить с цитированием
Старый 27.06.2024, 01:23   #23
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,894
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
А inc это и не процедура по сути. Есть набор инструкций, которые выглядят как процедуры/функции, вызываются как процедуры/функции, но функциями не являются. Скорее языковые конструкции.
Это часть той самой Compile Magic.
northener вне форума Ответить с цитированием
Старый 27.06.2024, 12:30   #24
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,619
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Есть набор инструкций, которые выглядят как процедуры/функции, вызываются как процедуры/функции, но функциями не являются.
Вызглядят и вызываются как... где, в исходнике - или сгенерированном коде? Если второе, то будучи функциями как таковыми, они будут вызываться стандартным образом: сохранение адреса возврата, PSW и используемых регистров, передача управления коду функции и восстановление сохранённого. В противном случае - если они не функции, а только похожи - при каждом "псевдовызове" будет генрироваться код, реализующий искомое. Тот самый in-line.

Последний раз редактировалось digitalis; 27.06.2024 в 12:33.
digitalis вне форума Ответить с цитированием
Старый 27.06.2024, 15:51   #25
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,640
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
где, в исходнике - или сгенерированном коде?
В исходнике, конечно. Просто синтаксически похоже на процедуру/функцию, но ею не является. К примеру, в Лазарусе есть нажать Ctrl и навести на любую процедуру/функцию, она подсвечивается как ссылка. А вот такие как inc вообще никак не реагируют, как какой-нибудь for или if...
Arigato вне форума Ответить с цитированием
Старый 27.06.2024, 22:39   #26
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 653
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
теперь запили отдельную библиотеку *.pas и скинь всем в тему. пусть используют, кто занимается расчётами.
и кстати, эту строки b:=b+k; тоже можно сделать через inc() - быстрее будет, там надо через запятую параметр k написать.
Две процедуры с interface
Код:
Function Sqrt64(var a:Int64):LongWord;
Function SqrtWord(const w:LongWord):LongWord;
Код:
Procedure SqrtEngine;
asm
  mov esi, 1073741824 {2^30}
  mov ebx, 32768      {2^15}

  @Begin1:
    cmp esi, edi
      jbe @End1

    shr esi, 2
    shr ebx, 1

    jmp @Begin1
  @End1:

  mov esi, 0

  @Begin2:
    mov ecx, esi
    add ecx, ebx
    mov eax, ecx
    mov edx, 0

    mul ecx

    cmp eax, edi
      ja @Big1

    add esi, ebx

    @Big1:
    shr ebx, 1

    cmp ebx, 0
      ja @Begin2

  mov eax, esi
end;

Function SqrtWord(const w:LongWord):LongWord;
asm
  push ebx
  push edi
  push esi

  mov edi, eax
  call SqrtEngine

  pop esi
  pop edi
  pop ebx
end;

Function Sqrt64(var a:Int64):LongWord;
asm
  push ebx
  push edi
  push esi

  mov edi, [eax]
  mov esi, [eax+4] {Çàãðóçèëè íà÷àëüíîå ÷èñëî}

  cmp esi, 0
    ja @Start1

  call SqrtEngine
  jmp @ExitFast

  @Start1:
  push ebp
  mov ebp, 1073741824
  mov ebx, 2147483648

  @Begin0:
    cmp ebp, esi
      jbe @End0

    shr ebp, 2
    shr ebx, 1

    jmp @Begin0
  @End0:

  mov ebp, 0
  @Begin1:
    mov ecx, ebp
    add ecx, ebx
    mov eax, ecx
    mov edx, 0

    mul ecx

    cmp edx, esi
      ja @Big1
      jb @Go1

    cmp eax, edi
      ja @Big1

    @Go1:
    add ebp, ebx

    @Big1:
    shr ebx, 1

    cmp ebx, 0
      ja @Begin1

  mov eax, ebp

  pop ebp

  @ExitFast:
  pop esi
  pop edi
  pop ebx
end;
Kronos913 вне форума Ответить с цитированием
Старый 15.07.2024, 06:57   #27
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,828
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Есть переменная Int64, но я не нашел ее "положительного" аналога в виде некоего Word64 (Если говорить о 32 разрядном Delphi 7)
В Delphi 7 появился «недокументированный» тип UInt64. В чем именно его недоделанность, не изучал.

Цитата:
Сообщение от Arigato Посмотреть сообщение
А inc это и не процедура по сути. Есть набор инструкций, которые выглядят как процедуры/функции, вызываются как процедуры/функции, но функциями не являются. Скорее языковые конструкции.
В богомерзком Си оно называется заморским словом интринсик. В Delphi условно к ним также относятся Break и Continue, управляющие выполнением цикла. Это всё тлетворное влияние Turbo Pascal 7.0, с которого всё пошло.

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Итог (на картинке): с числами до 2^32 мой код работает быстрее, а вот с числами после 2^32 - медленнее
Код с GetTickCount не вызывает доверия. Замеры скорости выполнения должны делаться через QueryPerformanceCounter. Вытащил код своего класса-обертки:
Код:
type
  TPerformanceCounter = class
  private
    FFrequency: UInt64;
    function GetValue: UInt64;
  public
    constructor Create;
    function MillisecondsFrom(StartValue: UInt64): Double;
    function MillisecondsBetween(Value1, Value2: UInt64): Double;

    property Frequency: UInt64 read FFrequency;
    property Value: UInt64 read GetValue;
  end;

constructor TPerformanceCounter.Create;
var
  Freq: Int64;
begin
  if QueryPerformanceFrequency(Freq) then // types of format and actual parameters must be equal
    FFrequency := Freq;
end;

function TPerformanceCounter.MillisecondsFrom(StartValue: UInt64): Double;
begin
  Result := (GetValue - StartValue) / FFrequency;
end;

function TPerformanceCounter.GetValue: UInt64;
var
  Rslt: Int64;
begin
  if QueryPerformanceCounter(Rslt) then
    Result := Rslt
  else
    Result := 0;
end;

function TPerformanceCounter.MillisecondsBetween(Value1, Value2: UInt64): Double;
begin
  Result := (Value2 - Value1) / FFrequency;
end;
В разработке: воспроизводственный контур ИТ
Vapaamies вне форума Ответить с цитированием
Старый 15.09.2024, 19:54   #28
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,834
По умолчанию

так, c корнем квадратным разорались. теперь для вычислений надо бы ещё корень кубический и любой другой степени.
а есть модуль для быстрого вычисления числа в степени?
ведь корень - это по сути число в степени 1/2.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 16.09.2024, 10:28   #29
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,619
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
c корнем квадратным разорались
Да, орали на всю округу
Цитата:
а есть модуль для быстрого вычисления числа в степени?
Через логарифм. Есть что-нибудь пошустрее? Не припомню.
digitalis вне форума Ответить с цитированием
Старый 16.09.2024, 17:13   #30
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,640
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Есть что-нибудь пошустрее? Не припомню.
Однозначно есть что-то шустрее стандартного Power из модуля Math. Натыкался на его разбор давным-давно, лет так 15 назад...
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо написать "таймер", который будет запускаться при нажатии кнопки "Start", приостанавливаться на "Pause", и сбрасываться на "Reset" billiejean78 JavaScript, Ajax 1 03.09.2021 08:58
Убрать папки "Pictures", "Music", "Видео", "Downloads" из "МОЙ КОМПЬЮТЕР" Бахтиёр1916 Windows 1 05.04.2017 12:53
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Вычисление квадратного корня вручную 6AZblJlb Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 16.11.2011 04:02
Как "натянуть" сайт написанный вручную на CMS ? zlo_999 HTML и CSS 3 01.02.2011 09:57