summaryrefslogtreecommitdiffstats
path: root/config-provisioning
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-09-23 21:04:16 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-09-23 21:04:16 +0000
commit08ace27cf15655e6b9b3df61a217611297d05e57 (patch)
tree4b637ef6411bd92c19febd57af3335df55dff238 /config-provisioning
parent29d266ae1e5c95e25002b97822953fdd02b1451e (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.java32
-rw-r--r--config-provisioning/src/test/java/com/yahoo/config/provision/NodeResourcesTest.java26
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);
}
}