【问题标题】:How to optimize division by 100?如何优化除以 100?
【发布时间】:2012-07-11 21:49:06
【问题描述】:

我有一段代码运行到一个循环中,除以 100,这减少了我的 fps 计数。

在大多数情况下,int/uint 类型除以 100,得到一个简单的 Number

我只是想知道任何优化它的方法。

编辑: @scriptocalypse 建议的小基准 - 乘以 0.01:

import flash.utils.getTimer;

for(var k:Number = 20; k > 0; k--)
{
    var a:int = getTimer();

    var o:Number = 100;
    var p:Number;
    for(var i:Number = 100000000; i > 0; i--)
    {
        p = o * 0.01;  // took 423~510   <--------------
        //p = o / 100;  // took 713~768   <--------------
    }

    var b:int = getTimer();

    trace( b - a);
}

【问题讨论】:

  • 你能解释一下你在做什么吗?大约有 100% 的机会改进你正在做的事情的方式会比改变一个单一的部门操作带来更好的改进。
  • @BlueRaja-DannyPflughoeft 我更正了所有其他可能成为问题的问题。游戏已经基本完成,我只是想改进一些关键代码片段,这些代码在某些设备上可能会有点慢。
  • 但更多信息将帮助我们帮助您优化。例如,在进行除法之后,您将如何处理这些数字 - 将它们加在一起?先把它们全部加起来,然后再分开,可能会更快。还是您要划分数组中的每个条目?您也许可以并行化,甚至更好地将任务偏移到 GPU (我对 Actionscript 的了解不够,无法确定)。或者,也许我们可以建议一种替代算法来实现您想要的没有数百万个部门。但是,如果不知道您首先要做什么,我们就无法做到这一点!

标签: actionscript-3 math optimization


【解决方案1】:

我怀疑导致大部分问题的不是除法,因为与其他运算相比,即使是缓慢的数学运算也应该相对较快。

此时:

x * 0.01;

理论上应该比

x / 100;

我仍然怀疑它不会有太大的不同。你还在循环中做什么?

【讨论】:

  • 这确实取得了一点但明显的改进。位移位怎么样?也许它可以改进更多?
  • 它提高了 30% 的速度 - 这不是“小”。
  • @weltraumpirat,这是一个真实项目中的一点改进。该基准测试是一个非常不真实的案例,只是为了测试目的 - 只是为了证明乘法比除法更快。在我的项目中,迭代没有 1 亿次那么大。
  • @MarceloAssis 它仍然将速度提高了 30% - 1 亿次迭代只是让数字变得可衡量。
  • @Marcelo Assis 我很高兴这至少是一个可衡量的帮助,但你确定没有什么可以做的来节省你的代码吗?有没有办法减少你必须执行的数学运算的数量?有没有办法对比较进行智能分组?不重复比较?您是否经常访问诸如 x / y / 旋转(具有隐式 get/set 函数)之类的 sprite 属性,而不是在本地存储您的值并只分配一次?您是将对象引用存储在函数范围的变量中,还是使用 foo.bar.moo() 样式访问?
【解决方案2】:

几乎可以肯定,正确的答案是不要。程序员应该编写清晰易读的代码,编译器应该优化。

【讨论】:

  • 你是否建议程序员不要优化他们的代码,因为它可能更难阅读?那是愚蠢的。
  • @ilollar 不一定。如果性能影响严重损害用户体验,则可能需要进行优化。否则,可读性永远是第一位的——这就是使代码可维护的原因。如果你的代码非常快,但没有其他程序员,甚至你自己,一个月后不能回来了解它在做什么,那么它很快就会变成一个非常昂贵的“优化”。另一方面,几毫秒的延迟几乎总是会被忽视。
  • @weltraumpirat 我并不是在提倡“难以阅读的优化代码”。毕竟,删除所有空白并将所有内容减少到一行在技术上可以称为“优化”,尽管这将是一件荒谬的事情。但是,OP 正在询问数学优化,并且一些可读性较差的操作(如按位或 RegEx)可能会使代码的可读性降低,但优化的好处仍然值得。
  • @weltraumpirat 我很抱歉,但我们在这里谈论的是同一件事吗? OP 正在询问如何进行低级数学优化以加快他的应用程序的事件循环和运行时。我非常关注代码组织和可读性,但是我们正在评论的这个特殊答案听起来像是程序员不应该为代码速度优化而烦恼,我认为这很荒谬。如前所述,仅仅因为按位和 RegEx 难以阅读并不意味着最好不要使用它们。
  • Sirs @weltraumpirat & ilollar 我认为即使需要(不希望的)优化使代码的某些部分变得不可读,程序员也可以添加 cmets 来解释下一行的原因和内容。在有很多人参与的项目中,我什至有放置链接的习惯,解释为什么我做了一些不流行的代码 sn-ps - 比如位移。
【解决方案3】:

你在评论中问:“位移怎么样?也许它可以改进更多?”

没有可用于除以 100 的按位运算,您只能使用位移来除以 2 的幂(2、4、8、16...)。

Here's 一个很好的帖子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2012-05-31
    • 2021-04-29
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多