我正在使用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调用效率低下,并且是性能问题的根源,我会非常惊讶。你的节目安排好了吗?你有没有用剖析器来识别你的应用程序中的热点?
我个人认为从整数到双精度浮点运算的转换不太可能提高性能。
在任何情况下,我的猜测是,你有其他的代码,你调用后,你已经显示的代码,它使用XY和它消耗的数量级比这个小片段更多的cpu。你大概不会计算XY然后丢弃它们:你怎么处理它们?
编辑: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;

07-26 05:56