所以,
我有一个名为IntRectangle的类,它包含int x1,int x2,int y1,int y2。
这是我的假设:
如果我将属性设置为公开,我将获得性能提升,因为我不必在访问它们时推送和弹出。我会试一试。
public class CrapMain {
public void start () {
IntRectangle rec = new IntRectangle (5, 10, 6, 12);
int value = 0;
double time = System.nanoTime();
for (int i = 0; i < 1000000000; i++){
value = rec.X1;
}
time = System.nanoTime() - time;
System.out.println(time);
}
public static void main(String[] args) {
new CrapMain().start();
}
}
它打印2559391.0
如果我将属性设为私有,请为它们创建getter并更改&#34; value = rec.X1;&#34; to&#34; value = rec.getX1();&#34;它打印3551075.0
因此,显然可以提升性能。
然而,它使代码变得古老,因为错误地更改属性很容易。
我的问题是,值得吗?编写高性能代码的程序员是否常见?
答案 0 :(得分:1)
不,它几乎永远不值得。
使用OO设计的最佳原则合理设计您的代码。如果性能成为一个问题,那么它(可能)不会因为对象访问而受到影响,它将归结为外部资源或设计不佳,并在此时进行优化。
如果你的要求意味着你真的担心单个陈述的纳秒级别的表现,那么用汇编程序编写你的程序,就会有更少的因素可以应对。
答案 1 :(得分:0)
你确定这个基准测量的是你认为的吗?微型计算机很难做到难以理解。
您的基准测试在热点启动并优化代码之前测量代码。事实上,在JIT将代码编译为本机汇编程序之后,你已经对Java解释器进行了基准测试而不是执行时间。
现代JVM可以优化getter方法,或者内联它们;然而,只有在JVM“预热”足以收集足够的统计信息然后用于优化代码中的“热点”之后,他们才会这样做。通常,一个方法必须运行一万次才能进行优化。您的方法只调用一次,并且其中包含一个非常大的循环,但它不会退出该方法。这意味着如果JVM想要在运行时优化for循环,则必须执行'on stack replacement' (OSR),这可能并且确实发生但在实际生产代码中并不常见。当它发生时,OSR优化代码与非OSR优化代码不同,它具有不同的性能特征。
因此,总而言之,目前尚不清楚您的实验是否会带来任何性能优势。
有关如何改进基准的建议,请参阅How do I write a correct micro-benchmark in Java?
那就是说,如果有性能提升,那还值得吗?这取决于上下文,进行该调用的次数以及该部分代码和项目的性能要求是什么?在绝大多数情况下,代码清晰度都会下降。