- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我得到了一个包含 200 个字段的文件,其值是使用反射检索的。我被要求重写它,因为它很慢。该文件有 200 个字符串字段,检索方式如下:
for (Field f : this.getClass().getFields())
{
try
{
Object o = f.get(this);
}
}
我已将代码推断为三个类进行测试;一种使用“完全”反射、部分反射和不反射的方法。
“完全”反射是上面列出的示例。它获取字段,循环遍历它们,然后获取与该字段关联的对象:
//Two hundred strings declared = "test String"
public void reflection()
throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
int count = 0;
long timer = System.nanoTime();
for (Field f : this.getClass().getFields()) {
count++;
Object o = f.get(this);
}
System.out.println(count);
System.out.print("Reflection: ");
System.out.println(System.nanoTime() - timer);
}
更少的反射涉及将所有字段的名称放入数组中并简单地执行 get()
方法:
//Two hundreds Strings declared = "test string"
//array holding the names of all the strings
public void reflection()
throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
int count = 0;
long timer = System.nanoTime();
for (String s : fieldnames) {
Field field = this.getClass().getField(s);
Object obj = field.get(this);
count++;
}
System.out.println(count);
System.out.print("Less reflection: ");
System.out.println(System.nanoTime() - timer);
}
最后一个完全没有反射。这200个字符串被写出来,然后在运行时分配给另一个字符串。
//Two hundred strings declared = "test String"
public void reflection()
throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
int count = 0;
long timer = System.nanoTime();
String newVariable1 = variable1;
String newVariable2 = variable2;
//continued for all two hundred
System.out.print("No reflection: ");
System.out.println(System.nanoTime() - timer);
}
当我运行“完整”反射时,我得到: 反射(reflection):1511155
当我运行较少的反射时,我得到: 较少反射:1811682
当我不运行反射时,我得到: 无反射:199956
虽然这些数字有所不同,但趋势是相同的:我的结果与我的预期完全相反!使用的反射越少,速度就越慢?我使用 System.nanoTime()
是否错误?我对反射(reflection)有误解吗?编译器又跟我开了个玩笑吗?
最佳答案
Have I been misinformed about reflection?
没有。
常规 Java 比反射 Java 更快。 (我的内存1是性能差异不像旧版本的 Java 中那么大,但仍然存在显着差异。)
Is the compiler playing another joke on me?
没有。
这里实际上是一个写得不好的“微基准”示例,它会给您带来误导性的结果。
请阅读此问答 - How do I write a correct micro-benchmark in Java?
<小时/>1 - 如果有人可以找到可靠的引用资料来支持这一点,请告诉我。
关于java - 要求重写反射,因为它很慢 - 事实并非如此?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39854739/
我已经在 Ext-GWT 论坛上发布了这个问题,我只是希望这里有人可以为我解答! 我正在努力做一些我最初认为很简单的事情,但我开始相信这是不可能的...... 我有一个各种各样的“布局模板”——简单地
以下代码取自 a tutorial我得到了一个奇怪的结果。 IntSummaryStatistics ageSummary = persons .stream() .c
我是一名优秀的程序员,十分优秀!