我正在使用delphi2007年和一些演示软件工作。 我正在使用的当前模块是video的过渡filter。 我使用的转换代码(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的葡萄酒实施大概是非常接近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;
你不能找到MulDiv的实际代码,因为它是一个WinAPI函数。 不过,我怀疑,因为它在WinAPI本身中被大量使用,所以它可能是一些非常优化的汇编代码,而不仅仅是一些函数调用。
至于你的改变是否更有效率,唯一确定的方法是两种方式分析代码,看看哪个更快。 在这里搜索“德尔福分析器”的一些建议(如果您使用德尔福XE,您可以使用包括的AQTime)。
顺便说一句,当你谈论诸如优化之类的东西的时候,指出你实际使用的Delphi版本通常是非常有用的,因为编译器的改变可以使答案有所不同。
正如其他人所说,你应该寻找一个分析器来确定热点。
一旦你找到了它们,在你的案例中,在多媒体应用程序中找到比你当前代码更快的东西,可能需要你了解SIMD机器语言指令,并且可能需要你编写替代的手工优化的断言代码来获取更快的结果。
使用浮点类型在Pascal中自己写一些东西是不太可能导致性能改进的。 缓存中间结果可能会导致内存使用量呈指数级增长,只有适度的速度提高,这可能会在可能发生vm寻呼(抖动)的系统上实际上减慢速度。