windows - MulDiv 是否比存储已知值和在其他代码中进行数学计算效率低

标签 windows delphi optimization math delphi-2007

我正在使用 Delphi 2007 并开发一些演示软件。我正在研究的当前模块是视频的过渡过滤器。我正在使用的转换代码(TPicShow 的 PSEffects 单元)需要基于帧尺寸和转换进度的 X 和 Y 值。这是代码

Type
TPercent = 0..100;
var
ATo  : TBitmap; //
Prog : Integer; //Progress of the transition

      if ATo.Width >= ATo.Height then
    begin
      X := MulDiv(ATo.Width, Prog, High(TPercent));
      Y := MulDiv(X, ATo.Height, ATo.Width);
    end
  else
    begin
      Y := MulDiv(ATo.Height, Prog, High(TPercent));
      X := MulDiv(Y, ATo.Width, ATo.Height);
    end;

我正在尝试对此进行优化,发现我可以保存不变的计算(直到 ATo 的尺寸发生变化)并删除每帧的 2 个除法计算。

所以它会是这样的

{All of these are calculated when the dimensions of ATo Change}
WDP : real; // width divided by High(TPercent)
HDW : real; // Height divided by width
HDP : real; // Height divided by High(TPercent)
WDH : real; // Width divided by Height

  if ATo.Width >= ATo.Height then
    begin
      X := Trunc(WDP * Prog);
      Y := Trunc(HDW * X);
    end
  else
    begin
      Y := Trunc(HDP * Prog);
      X := Trunc(WDH * Y);
    end;

听起来不错,但我不确定是否有 MulDiv 的实际代码。如果它只是这样做(非常简化)

MulDiv(a,b,c : Integer)
begin
  Round((A*B)/C);
end

然后我知道我的更改会更有效率,但是如果 MulDiv 在优化功能方面做了任何非常酷的事情(我认为它可能会这样做)那么我不确定我的更改是否会给我带来任何好处。

我的改变会更有效率吗?

编辑:我还没有实现这个,我只是在娱乐这个概念。

最佳答案

您找不到MulDiv 的实际代码因为它是一个 WinAPI 函数。不过,我怀疑,因为它在 WinAPI 本身中大量使用,所以它可能是一些非常优化的汇编代码,而不仅仅是几个函数调用。

至于您的更改是否会更有效,确定这一点的唯一方法是对两种方式的代码进行概要分析,看看哪个更快。在此处搜索“Delphi 分析器”以获得一些建议(如果您使用的是 Delphi XE,则可以使用随附的 AQTime)。

顺便说一句,当您谈论优化等问题时,指出您实际使用的是哪个 Delphi 版本通常非常有用,因为编译器中的更改可能会导致答案不同。

关于windows - MulDiv 是否比存储已知值和在其他代码中进行数学计算效率低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4805380/

相关文章:

c++ - IOCP 是否创建自己的线程?

multithreading - 方法指针赋值线程安全吗?

delphi - 如何在Delphi中使用CCR.EXIF从JPG EXIF读取GPS坐标?

optimization - 在 Rust 中从迭代器填充切片的最佳方法是什么?

c# - Windows UWP应用中的MediaElement无法播放音频

c++ - 编译 zxing 时 Libconv 无法转换参数

c# - 如何更改 Windows Phone 中 MenuFlyout 的外观?

delphi - 如何创建 single 的动态数组作为类中的属性

c - malloc 和 gcc 优化 2

oracle - 对 View 使用提示?