我最近在使用JSON存储同一个类的一定数量的子类的配置参数。为了保持统一的接口(interface),我为父类提供了 public void setParameter(String, String)
和 String getParameter(String)
方法。然后,每个子类将提供的参数转换为它们的 native 类型,并使用它们进行某种计算。
现在,我想知道:既然我已经将每个参数存储在一个 HashMap 中,那么为每个参数保留一个具有正确类型的单独字段真的有意义吗?考虑到我需要经常使用它们,每次需要时将字符串参数转换为其 native 类型的计算开销是多少?
谢谢
通努兹
最佳答案
我建议你测试一下。如果您需要多次执行此操作,这是一个相当昂贵的操作,但如果您首先使用它们来创建数据,它可能比 Double.toString() 或 Integer.toString() 更便宜。
我还建议您只使用 double
除非您知道使用 float
永远不会导致舍入问题。 ;)
它与创建对象(如 String 或向 HashMap 添加条目)一样昂贵。除非您也打算避免这样做,否则我不会担心。
编辑:与@Stackers 的基准测试类似,我会更长时间地运行测试并使用 nanoTime()
int runs = 10000000;
String val = "" + Math.PI;
long start = System.nanoTime();
for (int i = 0; i < runs; i++)
Float.parseFloat(val);
long time = (System.nanoTime() - start) / runs;
System.out.println("Average Float.parseFloat() time was " + time + " ns.");
long start2 = System.nanoTime();
for (int i = 0; i < runs; i++)
Double.parseDouble(val);
long time2 = (System.nanoTime() - start2) / runs;
System.out.println("Average Double.parseDouble() time was " + time2 + " ns.");
打印
Average Float.parseFloat() time was 474 ns.
Average Double.parseDouble() time was 431 ns.
顺便说一句:我有一个函数可以从一个直接的 ByteBuffer 中读取 double 值,这需要 80 ns。它更快,因为它不需要 String 并且不创建任何对象。但是,这样做绝非易事,您必须设计核心系统以避免创建任何对象。 ;)
关于java - 性能偏执狂 : how much expensive are Float. parseFloat(String), Integer.parseInt(String)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5549021/