- 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/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
PowerShell Web Access 允许您通过 Web 浏览器运行 PowerShell cmdlet。它显示了一个基于 Web 的控制台窗口。 有没有办法运行 cmdlet 而无需在控制台窗
我尝试在无需用户登录的情况下访问 Sharepoint 文件。 我可以通过以下任一方式获取访问 token 方法一: var client = new RestClient("https://logi
我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 首选的身份验证机制是 OAuth。我的应用目前已成功通过 OAuth 向服务进行身份
假设我有纯抽象类 IHandler 和派生自它的类: class IHandler { public: virtual int process_input(char input) = 0; };
我有一个带有 ThymeLeaf 和 Dojo 的 Spring 应用程序,这给我带来了问题。当我从我的 HTML 文件中引用 CSS 文件时,它们在 Firebug 中显示为中止。但是,当我通过在地
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 6 年前。 为什么这不起作用? func
我想将所有流量重定向到 https,只有 robot.txt 应该可以通过 http 访问。 是否可以为 robot.txt 文件创建异常(exception)? 我的 .htaccess 文件: R
我遇到了 LinkedIn OAuth2: "Unable to verify access token" 中描述的相同问题;但是,那里描述的解决方案并不能解决我的问题。 我能够成功请求访问 toke
问题 我有一个暴露给 *:8080 的 Docker 服务容器. 我无法通过 localhost:8080 访问容器. Chrome /curl无限期挂断。 但是如果我使用任何其他本地IP,我就可以访
我正在使用 Google 的 Oauth 2.0 来获取用户的 access_token,但我不知道如何将它与 imaplib 一起使用来访问收件箱。 最佳答案 下面是带有 oauth 2.0 的 I
我正在做 docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-co
我正在尝试使用静态 IP 在 AKS 上创建一个 Web 应用程序,自然找到了一个带有 Nginx ingress controller in Azure's documentation 的解决方案。
这是我在名为 foo.js 的文件中的代码。 console.log('module.exports:', module.exports) console.log('module.id:', modu
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用 MGTwitterEngine"将 twitter 集成到我的应用程序中。它在 iOS 4.2 上运行良好。当我尝试从任何 iOS 5 设备访问 twitter 时,我遇到了身份验证 to
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用以下 API 列出我的 Facebook 好友。 https://graph.facebook.com/me/friends?access_token= ??? 我想知道访问 token 过
401 Unauthorized - Show headers - { "error": { "errors": [ { "domain": "global", "reas
我已经将我的 django 应用程序部署到 heroku 并使用 Amazon s3 存储桶存储静态文件,我发现从 s3 存储桶到 heroku 获取数据没有问题。但是,当我测试查看内容存储位置时,除
我是一名优秀的程序员,十分优秀!