这个基本可以忽略不计。
public class Test37 {
private volatile int testi = 0; //为了防止程序做一些优化,定义成volatile public void setTesti(int testi) {
this.testi = testi;
} public static void main(String[] args) {
Test37 t = new Test37();
long l1 = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
t.testi = i;
}
long l2 = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
t.setTesti(i);
}
long l3 = System.currentTimeMillis(); System.out.printf("l1=%d,l2=%d,l3=%d,l2-l1=%d,l3-l2=%d", l1, l2, l3, l2
- l1, l3 - l2);
}
}
在我的机器上连续测试4次,每次的结果基本上都很接近,结果应该还是可以采信的。可见直接给属性赋值与通过set方法进行赋值在性能上基本可以忽略不计,当然这样测试有不科学的地方,set方法可能会占用更多的内存,我的测试结果只能表明占用的cpu时间基本一致,却无法测试内存的暂用情况,不过我想相对于一个企业应用来说,这种性能开销也是忽略不计的。l1=1414375853125,l2=1414375853750,l3=1414375854359,l2-l1=625,l3-l2=609
l1=1414375939281,l2=1414375939953,l3=1414375940625,l2-l1=672,l3-l2=672
l1=1414375954953,l2=1414375955593,l3=1414375956250,l2-l1=640,l3-l2=657
l1=1414375968078,l2=1414375968718,l3=1414375969359,l2-l1=640,l3-l2=641
public class Test37 {
private volatile int testi = 0; //为了防止程序做一些优化,定义成volatile public void setTesti(int testi) {
this.testi = testi;
} public static void main(String[] args) {
Test37 t = new Test37();
long l1 = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
t.testi = i;
}
long l2 = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
t.setTesti(i);
}
long l3 = System.currentTimeMillis(); System.out.printf("l1=%d,l2=%d,l3=%d,l2-l1=%d,l3-l2=%d", l1, l2, l3, l2
- l1, l3 - l2);
}
}
在我的机器上连续测试4次,每次的结果基本上都很接近,结果应该还是可以采信的。可见直接给属性赋值与通过set方法进行赋值在性能上基本可以忽略不计,当然这样测试有不科学的地方,set方法可能会占用更多的内存,我的测试结果只能表明占用的cpu时间基本一致,却无法测试内存的暂用情况,不过我想相对于一个企业应用来说,这种性能开销也是忽略不计的。l1=1414375853125,l2=1414375853750,l3=1414375854359,l2-l1=625,l3-l2=609
l1=1414375939281,l2=1414375939953,l3=1414375940625,l2-l1=672,l3-l2=672
l1=1414375954953,l2=1414375955593,l3=1414375956250,l2-l1=640,l3-l2=657
l1=1414375968078,l2=1414375968718,l3=1414375969359,l2-l1=640,l3-l2=641
解决方案 »
- 中芯国际编程面试题求解
- 为什么编译器要把ArrayIndexOutOfBoundsException留给JVM去处理?
- JAVA中有没有类似.NET的DataGrid的控件?
- 郁闷啊~输入全班成绩,算出平均成绩、最高分、最低分等
- 高分求解!
- 请教下面方法的作用,关于toHex和\u00
- 怎样判断一个日期(月日)是否在6月15日和9月30日之间??
- 一个循环问题,怎么样都跳不出!!
- 超级问题。java是否可以调用windows的com组件或api,以及C++是否可以调用java的class文件以及ejb组件
- 一道关于单例模式的题
- sycronized 的工作原理
- 关于UDP和TCP客户端单例的多线程问题
但是问题在于 get set有什么用呢 你写private的 人家想改一样能改
偶已运行Test37
偶发觉如果把volatile删掉,运行时间变短,而且l2 - l1明显小于 l3 - l2
这是因为如果没有volatile的话,程序自己将会优化,认为那么多次循环毫无意义,只有最后一次赋值才会被真正执行。而方法却每次都会被调用。