我是一名高级开发人员,所以这对我来说是一个愚蠢的问题。我的回答应该是NO,或者是什么? NO !!!
但我昨天正在开会,我正在解释一些PMD结果。当我们得到“太长的方法名称”问题时,我开始解释并且客户说:好了,记得长方法名称对性能有影响,程序运行速度较慢。
我说:不,你错了,只是一个干净的代码规则,并且对于获得一个好的代码很重要,但与性能无关,字节码与不同的名称相似。
但客户,会议中有些人在此争论,对此肯定。他们有一些项目,因为长的方法名称是导致业绩不佳的原因。
我唯一的想法是,一些内省或反思的东西与此有关,但除此之外,我确信,或者我认为我当然,方法名称长度没有任何性能影响。
对此有何想法或建议?
答案 0 :(得分:18)
可以说它会占用更多的内存和存储空间 - 因此,包含带有巨大方法名称的类的jar文件将大于具有短类名的类。例如。
但是,性能上的任何差异令人难以置信不太可能引人注目。我认为几乎某些,他们因为表现不佳而责备长方法名称的项目实际上被误诊了。这不是第一次发生的事情。
当然,从这种情况中消除热量的最佳方法是提供证据 - 如果性能很重要,您应该进行性能测试。使用长方法名称运行这些测试,然后将它们重构为简短的方法名称并重新运行测试。如果存在显着差异,我会感到非常惊讶。
答案 1 :(得分:4)
方法名称不仅与反射相关,而且在类加载过程中也是如此,当然在这两种情况下,长方法名称意味着在某种程度上CPU可以执行更多操作。然而,由于方法名称长度甚至是远程实用的(即长度不是数千个字符),我绝对肯定,与在反射或类加载期间必须完成的其他事情相比,这是不可能的。
答案 2 :(得分:1)
但是客户,会议中有一些人在争论 对此,确定无疑。他们用那么长的方法做了一些项目 名字是表现不佳的原因。
这听起来像一个完全猜测被视为事实。 这只是一些人对表现的一般性的一般情况。 即使它们恰好是正确的,也是一个完全猜测。
通过更改某些内容,每个程序都有提升性能的空间。 猜测不会告诉你这些是什么。
如果两个执行相同操作的程序具有不同的性能,则只表示它们已经进行了不同程度的优化。 你的挑战是解释这一点。
答案 3 :(得分:1)
如果缩短类名和成员名,启动时间将受到积极影响。为此,可以使用字节码缩小器。
例如,yguard(LGPL)可以缩小代码。它还允许您对堆栈跟踪进行反混淆处理以进行调试。
出于性能原因手动分配短类和成员名称当然是一个可怕的想法。
答案 4 :(得分:0)
我不知道为什么它可能会显着影响性能,除非你通过反射自己提取方法名称,然后在UI上呈现它们。显然情况并非如此。所以我只是感到困惑。您确定您的客户端不会将方法名称与文件名混淆,或者他是否在考虑一些非常古老的编程语言不支持超长方法名称的情况?根据这个人的年龄,他们的判断对于计算机科学家来说绝对是荒谬的。如果他们能够证明自己的观点,他们也可以将其提交给ACM,Oracle / Sun或麻省理工学院来验证他们的发现。
答案 5 :(得分:0)
这已在处理简单GET请求的ASP.NET Core 2 Web API上进行了测试。
首先,我像这样制作了一个ResponseObject:
public class CelestialObjectResponse
{
public CelestialObject CelestialObject { get; set; }
public CelestialObjectClassification CelestialObjectClassification { get; set; }
public CelestialObjectMeta CelestialObjectMeta { get; set; }
public CelestialObjectPosition CelestialObjectPosition { get; set; }
public IQueryable<CelestialObjectMarket> CelestialObjectMarkets { get; set; }
public IQueryable<CelestialObjectResponse> Children { get; set; }
}
当我调用我的API以获取大约1000个天体条目(每个都有分类,元数据,位置,市场等...)时,我的数据导致了6.8Mb的请求。
一旦我将ResponseObject重构为具有更短的属性名称,就像这样:
public class CelestialObjectResponse
{
public CelestialObject CO { get; set; }
public CelestialObjectClassification COCL { get; set; }
public CelestialObjectMeta COME { get; set; }
public CelestialObjectPosition COPO { get; set; }
public IQueryable<CelestialObjectMarket> COMA { get; set; }
public IQueryable<CelestialObjectResponse> Children { get; set; }
}
然后,ResponseObject的大小导致了一个6.2Mb的程序包,其交付速度比上一个Response快约300ms ...
因此,我可以得出一个结论,如果您使用Asp.Net Core Web Api,则响应属性的长度确实会对Asp.net API中响应的加载时间产生影响。请注意,我可以在CelestialObject,Classification,Meta,Position,Market Classes中重构更多的属性,以使响应大小更小!
因此,基本上,这是一件好事,但是不幸的是,我不知道运行时如何处理具有非凡长名称的变量。我可以想象在运行时会产生一些不明显的小影响,但是很难注意到。除非您同时执行多个昂贵的操作,否则事情会加在一起并消耗大量性能,因此,最好的方法是如果感觉不到代码中的性能不足,则要诊断并检查算法。
我希望这些信息对您有所帮助
亲切问候