性能偏执:Float.parseFloat(String),Integer.parseInt(String)多贵?

tun*_*nuz 4 java performance types casting interface

我最近使用JSON来存储同一类的一定数量的子类的配置参数.为了保持统一的界面,我为父类提供了public void setParameter(String, String)String getParameter(String)方法.然后,每个子类将提供的参数转换为其本机类型,并使用它们进行某种计算.

现在,我想知道:因为我已经将每个参数存储在HashMap中,为每个参数保留一个具有正确类型的单独字段真的有意义吗?每次我需要时,将String参数转换为本机类型的计算开销是多少,因为我需要经常使用它们?

谢谢
Tunnuz

Pet*_*rey 5

我建议你测试一下.如果你需要做很多次,但是比Double.toString()或Integer.toString()更便宜,如果你首先使用那些来创建数据,这是一个相当昂贵的操作.

我还建议你只使用,double除非你知道使用a 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.");
Run Code Online (Sandbox Code Playgroud)

版画

Average Float.parseFloat() time was 474 ns.
Average Double.parseDouble() time was 431 ns.
Run Code Online (Sandbox Code Playgroud)

顺便说一句:我有从直接ByteBuffer读取双精度的函数,需要80 ns.它更快,因为它不需要String,也不会创建任何对象.但是,执行此操作绝非易事,您必须设计核心系统以避免任何对象创建.;)