【问题标题】:Any advantage to using 'static' on private consts?在私有常量上使用“静态”有什么好处吗?
【发布时间】:2010-07-30 13:25:37
【问题描述】:

只是想知道使用是否有任何优势

private static const

而不是

private const

对于私有常量? 如果您只有一个或多个类的实例,这会改变吗? 我怀疑如果您有多个类实例,可能使用static 会带来一些小的内存/性能优势。

【问题讨论】:

    标签: flash actionscript-3 actionscript


    【解决方案1】:

    正如 mmsmatt 指出的那样,它们节省了一些内存。但是,通常这不是节省内存的最佳位置。您应该担心内存泄漏、高效的文件格式和一般的数据表示。

    静态常量的一个缺点是所有全局访问都比本地访问慢。 instance.ident 优于 Class.ident。运行此代码进行测试:

    package  {
        import flash.display.Sprite;
        import flash.text.TextField;
        import flash.utils.*;
        public class Benchmark extends Sprite {
            private static const delta:int = 0;
            private const delta:int = 0;        
            private var output:TextField;
            public function Benchmark() {
                setTimeout(doBenchmark, 1000);
                this.makeOutput();
            }
            private function doBenchmark():void {
                var i:int, start:int, sum:int, inst:int, cls:int;
    
                start = getTimer();
                sum = 0;
                for (i = 0; i < 100000000; i++) sum += this.delta;
                out("instance:", inst = getTimer() - start);
    
                start = getTimer();
                sum = 0;
                for (i = 0; i < 100000000; i++) sum += Benchmark.delta;
                out("class:", cls = getTimer() - start);
    
                out("instance is", cls/inst, "times faster");
            }   
            private function out(...args):void {
                this.output.appendText(args.join(" ") + "\n");
            }
            private function makeOutput():void {
                this.addChild(this.output = new TextField());
                this.output.width = stage.stageWidth;
                this.output.height = stage.stageHeight;
                this.output.multiline = this.output.wordWrap = true;
                this.output.background = true;          
            }       
        }
    }
    

    【讨论】:

    • 如果类不一定需要实例化怎么办?在这种情况下,也许使用非静态方法可以节省内存。
    • 对于好奇和懒惰的人,我在 Flash Player 调试器版本 11.7.700.169 (11.6) 中以调试模式运行了几次此代码,结果平均约为 instance is 1.01 times faster。但是,当我将每个测试的getTimer() - start 调用移到out(...) 调用之外时,我的平均值约为instance is 0.84 times faster。所以看起来,与三年前 back2dos 所声称的相反,现在这个测试用例中的全局访问实际上比本地访问
    • @mziwisky:首先,永远不要在调试播放器中进行基准测试。它完全扭曲了结果。其次,here's a more comprehensive test 支持我最初的主张。
    【解决方案2】:

    private static const 成员每个类型存储一次。

    private const 成员在每个实例中存储一次。

    是的,你节省了一些内存。

    【讨论】:

      【解决方案3】:

      视情况而定。

      如上所述,静态将每个类型一次,非静态将每个实例一次,因此这取决于您将拥有多少个实例。

      我之所以这么说是因为如果您有一个一次只实例化一次的组件(如提示弹出窗口)并且您在之后将其从内存中完全处理掉,那么这意味着您使用的是静态内存使用了不必要的内存因为它永远不会消失那个静态变量。 如果它是您将拥有多个实例(如粒子或多个窗口)的东西,那么是的,最好使用静态,因为它们将共享相同的变量。

      【讨论】:

        猜你喜欢
        • 2011-04-25
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        • 2021-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多