使用java中的公共属性获得性能?

时间:2014-11-07 10:38:43

标签: java variables

所以,

我有一个名为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

因此,显然可以提升性能。

然而,它使代码变得古老,因为错误地更改属性很容易。

我的问题是,值得吗?编写高性能代码的程序员是否常见?

2 个答案:

答案 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?

那就是说,如果有性能提升,那还值得吗?这取决于上下文,进行该调用的次数以及该部分代码和项目的性能要求是什么?在绝大多数情况下,代码清晰度都会下降。