- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Noobie华夫饼和/或序言:
好吧,这是我的第一个问题,多年来,SO始终没有引导我正确的方向,尽管如此,我仍然是一个穷人,或者充其量只是想成为一名程序员,并且仍然继续发现一些困扰我的问题。和回头。这个问题就是其中之一,但是有一次我找不到具体的答案,有很多切题和平行讨论,但是我认为回答这个问题没有什么让我更清楚地理解。
因此,事不宜迟...
问题:
什么是更快(和/或最佳实践);制作一个静态的类函数,从而可以从包中的其他任何地方调用它,或者在您希望使用它的时间和位置实例化该类,然后引用实例函数?
我到目前为止所读的所有内容都指出,静态通常比实例函数/变量要慢,但是我一直在与之抗争的是,首先实例化一个类,仅访问其中的一个元素并没有成本。
似乎实例化的行为除了要随后访问要使用的属性(在ClassName.function()中)外,在MS中还应付出代价。不,这意味着静态路由会更快吗?无论哪种方式,多少钱?仅在单击时调用的内容或仅以ENTER_FRAME事件的速率显示的内容是否会引起注意?
除了速度外,实例化一个类也没有存储成本,例如,当您只想从包装盒中直接购买一包时就购买了多包薯片,从长远来看,这可能会更好,但是从长远来看,如果您只吃过一包薯片,实际上成本更高,而且它在您的手推车上占据了更多空间,这意味着其他东西的空间更少了,对我来说没有泡沫腾涌:(我不确定如果这个比喻有帮助...
无论如何,我将开始尝试自己进行基准测试,但与此同时,对于那些有知识的人(比我更有知识和经验的人)来说,这似乎是一个简单的答案, ,如果能提供宝贵的见解,我将不胜感激。
到目前为止,this最接近于回答我的问题,但是我在提取问题的具体答案时遇到了麻烦,也许是我缺乏理解才是原因所在,并且答案已经存在。
回顾TLDR和节省时间;
什么是更快/最佳实践;调用静态函数或实例化一个类,然后调用实例函数?
是否仅考虑实例化一个类的成本,以仅访问该类的一个元素?
对于更快的路线,要快多少?
在仅通过点击或ENTER_FRAME调用的内容上是否会引起注意?
除了速度之外,实例化整个类是否比使用静态方法引用要高得多的内存开销?
如果您有时间回答,我想先谢谢您。
[编辑]
好的,所以我进行了快速测试,我已经回答了我的问题,但是仍然认为最佳实践和其他人的意见会对我的学习有所帮助。 (请参阅下面的测试。
好的,所以我有两个类,主文档类和另一个类。
维护
import flash.display.Sprite;
import flash.utils.getTimer;
public class Main extends Sprite
{
private static var preInstancedOtherClass:OtherClass = new OtherClass();
private var averageOf:int = new int(10);
public function Main()
{
runTests();
}
private function runTests() : void
{
var msRuntime1:Number = 0;
var msRuntime2:Number = 0;
var msRuntime3:Number = 0;
for(var i:int = 0; i < averageOf; i++)
{
msRuntime1 += test1();
msRuntime2 += test2();
msRuntime3 += test3();
}
trace("static function ex-time: " + (msRuntime1/averageOf));
trace("instance function ex-time: " + (msRuntime2/averageOf));
trace("preInstance function ex-time: " + (msRuntime3/averageOf));
}
private function test1() : Number
{
var start_time:int = getTimer();
OtherClass.testFunc1();
return (getTimer()-start_time);
}
private function test2() : Number
{
var start_time:int = getTimer();
var instanceofOtherClass:OtherClass = new OtherClass();
instanceofOtherClass.testFunc2();
return (getTimer()-start_time);
}
private function test3() : Number
{
var start_time:int = getTimer();
preInstancedOtherClass.testFunc2();
return (getTimer()-start_time);
}
}
import flash.display.Sprite;
public class OtherClass extends Sprite
{
private var testLoop:int = new int(1000000);
private static var staticTestLoop:int = new int(1000000);
public function OtherClass() : void
{
//Do naffink
}
public static function testFunc1() : void
{
var testInt:int = 0;
for(var i:int = 0; i < staticTestLoop; i++)
{
testInt += 10;
}
}
public function testFunc2() : void
{
var testInt:int = 0;
for(var i:int = 0; i < testLoop; i++)
{
testInt += 10;
}
}
}
最佳答案
由于问题缺乏适当的上下文,因此我在这里假设某种通用的上下文。与这些事情一样,请测试您的特定情况以查看最适合您的情况。
回顾TLDR和节省时间;
什么是更快/最佳实践;调用静态函数或实例化一个类,然后调用实例函数?
看来您已经更快地解决了。最佳实践...所有静态函数(无I / O,并且给定相同的输入,相同的输出)应静态调用。就像您使用Math
一样。 Math.random()
是这里的例外。但是,如果需要保持某种状态,则最好实例化该类。
是否仅考虑实例化一个类的成本,以仅访问该类的一个元素?
措词含糊,因此请改写:“我在回答第一个问题时是否考虑了性能成本?”是的,我做到了。我立即放弃了它对我的回答的影响。在需要多次使用该函数的循环中,将实例化作为几乎自然的优化而移出了循环。剩下的唯一情况是常规的一次性使用-那时不再重要。停止微优化,直到需要它为止-花费时间在开发上,这样,当您确实需要额外的性能时,就可以串接一堆性能提升(正确设置基准测试环境是一件麻烦的事情,最好一次完成)。
例如。您在代码中混合了数字类型Number
和int
。这需要转换。那是性能上的打击。多大?您必须进行测试。但是通常情况下,如果您开始担心这些小的优化,您就会错过更大的优化。
对于更快的路线,要快多少?
显然,在您的测试环境上需要2毫秒。
在仅通过点击或ENTER_FRAME调用的内容上是否会引起注意?
不。在30 FPS时,您有33.3ms的可用时间。在60 FPS时,您有16.6ms的可用时间。 2毫秒很容易就可以装在那里。
除了速度之外,实例化整个类是否比使用静态方法引用要高得多的内存开销?
内存成本?
上课吗?
您不必担心的另一件事(如果您想知道,请进行测试...)
对象吃得多的内存。特别是对象的集合。
在游戏中,这将是一个关卡的所有图块,或者是所有敌人,所有图形……这一切需要占用更多,更多,更多的内存。
简而言之...
除非您必须在非常旧的设备上工作,或者遇到性能/内存问题(并且已经在设计级上消除了很多缺陷!),否则大多数情况都无关紧要。
关于performance - AS3-创建实例以访问方法/函数或使用静态[更新-一些基准测试-已添加],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24727147/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!