我正在使用 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/