我正在使用Delphi2007并开发一些演示软件。我正在研究的当前模块是视频转换过滤器。我正在使用的转换代码(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调用效率低下,并且是性能问题的根源,我会非常惊讶。你的节目安排好了吗?你有没有用剖析器来识别你的应用程序中的热点?
我个人认为从整数到双精度浮点运算的转换不太可能提高性能。
在任何情况下,我的猜测是,你有其他的代码,你调用后,你已经显示的代码,它使用X
和Y
和它消耗的数量级比这个小片段更多的cpu。你大概不会计算X
和Y
然后丢弃它们:你怎么处理它们?
编辑:muldiv的wine实现可能非常接近windows,其核心是:
if ( ( (nMultiplicand < 0) && (nMultiplier < 0) ) ||
( (nMultiplicand >= 0) && (nMultiplier >= 0) ) )
ret = (((LONGLONG)nMultiplicand * nMultiplier) + (nDivisor/2)) / nDivisor;
else
ret = (((LONGLONG)nMultiplicand * nMultiplier) - (nDivisor/2)) / nDivisor;