diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-09-23 21:04:16 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-09-23 21:04:16 +0000 |
commit | 08ace27cf15655e6b9b3df61a217611297d05e57 (patch) | |
tree | 4b637ef6411bd92c19febd57af3335df55dff238 /config-provisioning | |
parent | 29d266ae1e5c95e25002b97822953fdd02b1451e (diff) |
Since only a simple single decimal floatingpoint number is needed avoid using string and floating point formatting. Use a simpler variant you get a 15 X speedup of this frequently called code.
Diffstat (limited to 'config-provisioning')
-rw-r--r-- | config-provisioning/src/main/java/com/yahoo/config/provision/NodeResources.java | 32 | ||||
-rw-r--r-- | config-provisioning/src/test/java/com/yahoo/config/provision/NodeResourcesTest.java | 26 |
2 files changed, 53 insertions, 5 deletions
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/NodeResources.java b/config-provisioning/src/main/java/com/yahoo/config/provision/NodeResources.java index 9cae0a08360..e5c2bf658ab 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/NodeResources.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/NodeResources.java @@ -1,6 +1,9 @@ // Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.provision; +import java.text.DecimalFormat; +import java.text.FieldPosition; +import java.text.NumberFormat; import java.util.Locale; import java.util.Objects; import java.util.Optional; @@ -215,13 +218,32 @@ public class NodeResources { return Objects.hash(vcpu, memoryGb, diskGb, bandwidthGbps, diskSpeed, storageType); } + private static StringBuffer appendDouble(StringBuffer sb, double d) { + sb.append((long)d).append('.').append(Math.round(d*10)%10); + return sb; + } @Override public String toString() { - return String.format(Locale.ENGLISH, "[vcpu: %1$.1f, memory: %2$.1f Gb, disk %3$.1f Gb" + - (bandwidthGbps > 0 ? ", bandwidth: %4$.1f Gbps" : "") + - ( ! diskSpeed.isDefault() ? ", disk speed: " + diskSpeed : "") + - ( ! storageType.isDefault() ? ", storage type: " + storageType : "") + "]", - vcpu, memoryGb, diskGb, bandwidthGbps); + StringBuffer sb = new StringBuffer("[vcpu: "); + appendDouble(sb, vcpu); + sb.append(", memory: "); + appendDouble(sb, memoryGb); + sb.append(" Gb, disk "); + appendDouble(sb, diskGb); + sb.append(" Gb"); + if (bandwidthGbps > 0) { + sb.append(", bandwidth: "); + appendDouble(sb, bandwidthGbps); + sb.append(" Gbps"); + } + if ( !diskSpeed.isDefault()) { + sb.append(", disk speed: ").append(diskSpeed); + } + if ( !storageType.isDefault()) { + sb.append(", storage type: ").append(storageType); + } + sb.append(']'); + return sb.toString(); } /** Returns true if all the resources of this are the same or larger than the given resources */ diff --git a/config-provisioning/src/test/java/com/yahoo/config/provision/NodeResourcesTest.java b/config-provisioning/src/test/java/com/yahoo/config/provision/NodeResourcesTest.java index 21e1afeed17..8d39691a3bb 100644 --- a/config-provisioning/src/test/java/com/yahoo/config/provision/NodeResourcesTest.java +++ b/config-provisioning/src/test/java/com/yahoo/config/provision/NodeResourcesTest.java @@ -16,6 +16,32 @@ public class NodeResourcesTest { new NodeResources(1., 10., 100., 0).toString()); assertEquals("[vcpu: 0.3, memory: 3.3 Gb, disk 33.3 Gb, bandwidth: 0.3 Gbps]", new NodeResources(1/3., 10/3., 100/3., 0.3).toString()); + assertEquals("[vcpu: 0.7, memory: 6.7 Gb, disk 66.7 Gb, bandwidth: 0.7 Gbps]", + new NodeResources(2/3., 20/3., 200/3., 0.67).toString()); + } + + private long runTest(NodeResources [] resouces, int num) { + long sum = 0; + for (int i = 0; i < num; i++) { + for (NodeResources ns :resouces) { + sum += ns.toString().length(); + } + } + return sum; + } + @Test + public void benchmark() { + NodeResources [] resouces = new NodeResources[100]; + for (int i = 0; i < resouces.length; i++) { + resouces[i] = new NodeResources(1/3., 10/3., 100/3., 0.3); + } + int NUM_ITER = 100; // Use at least 100000 for proper benchmarking + long warmup = runTest(resouces, NUM_ITER); + long start = System.nanoTime(); + long benchmark = runTest(resouces, NUM_ITER); + long duration = System.nanoTime() - start; + System.out.println("NodeResources.toString() took " + duration/1000000 + " ms"); + assertEquals(warmup, benchmark); } } |