谁能告诉我其中任何一个是否会比在Java 1.6下编译的其他任何一个更好?假设MyObject是一个带有一个名为listField的字段的类,它有一个getter和setter
样品#1:
MyObject obj = new MyObject();
List<String> lst = new ArrayList<String>(1);
lst.add("Foo");
obj.setListField(lst);
Run Code Online (Sandbox Code Playgroud)
样品#2:
MyObject obj = new MyObject();
obj.setListField(new ArrayList<String> (1));
obj.getListField().add("Foo");
Run Code Online (Sandbox Code Playgroud)
我的想法是,ArrayList的一个本地实例的创建将创建内存开销,但调用getListField()每当你想添加到列表是不一样快访问列表的本地版本.也许,如果有要添加到列表中的几个项目,样品#1是快,但只有少数项目样本#2是更快?或将编译器优化这一点,以便调用getListField()等效于访问列表的本地版本?
没有"本地实例"这样的东西.假设setListField()并且getListField()是微不足道的方法,这些样本之间应该几乎没有性能差异 - 如果有的话.假设您正在使用HotSpot并且没有加载任何覆盖setListField或getListField的子类,我希望这些方法可以内联.
你需要了解当你打电话时setListField()(再次,假设这是一个微不足道的实现),你不是要创建列表的副本,或者类似的东西.您只是传递对列表对象的引用.然后将该引用复制到该字段中.非常便宜.同样地,我希望getListField()简单地返回字段的值 - 对列表的引用.唯一被复制的是引用 - 可能是4或8个字节,具体取决于您的JVM.
就个人而言,第一个样本对我来说看起来更干净,但你应该集中精力去理解这里发生的事情,而不是表现.
| 归档时间: |
|
| 查看次数: |
149 次 |
| 最近记录: |