io.prestosql.benchmark.FormatUtils Maven / Gradle / Ivy
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.prestosql.benchmark;
import io.airlift.units.DataSize;
import io.airlift.units.Duration;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import static io.airlift.units.DataSize.Unit.BYTE;
import static java.lang.String.format;
import static java.util.concurrent.TimeUnit.SECONDS;
// TODO: these should be in airlift
final class FormatUtils
{
private FormatUtils() {}
public static String formatCount(long count)
{
double fractional = count;
String unit = "";
if (fractional > 1000) {
fractional /= 1000;
unit = "K";
}
if (fractional > 1000) {
fractional /= 1000;
unit = "M";
}
if (fractional > 1000) {
fractional /= 1000;
unit = "B";
}
if (fractional > 1000) {
fractional /= 1000;
unit = "T";
}
if (fractional > 1000) {
fractional /= 1000;
unit = "Q";
}
return format("%s%s", getFormat(fractional).format(fractional), unit);
}
public static String formatCountRate(double count, Duration duration, boolean longForm)
{
double rate = count / duration.getValue(SECONDS);
if (Double.isNaN(rate) || Double.isInfinite(rate)) {
rate = 0;
}
String rateString = formatCount((long) rate);
if (longForm) {
if (rateString.endsWith(" ")) {
rateString = rateString.substring(0, rateString.length() - 1);
}
rateString += "/s";
}
return rateString;
}
public static String formatDataSize(DataSize size, boolean longForm)
{
double fractional = size.toBytes();
String unit = null;
if (fractional >= 1024) {
fractional /= 1024;
unit = "K";
}
if (fractional >= 1024) {
fractional /= 1024;
unit = "M";
}
if (fractional >= 1024) {
fractional /= 1024;
unit = "G";
}
if (fractional >= 1024) {
fractional /= 1024;
unit = "T";
}
if (fractional >= 1024) {
fractional /= 1024;
unit = "P";
}
if (unit == null) {
unit = "B";
}
else if (longForm) {
unit += "B";
}
return format("%s%s", getFormat(fractional).format(fractional), unit);
}
public static String formatDataRate(DataSize dataSize, Duration duration, boolean longForm)
{
double rate = dataSize.toBytes() / duration.getValue(SECONDS);
if (Double.isNaN(rate) || Double.isInfinite(rate)) {
rate = 0;
}
String rateString = formatDataSize(new DataSize(rate, BYTE), false);
if (longForm) {
if (!rateString.endsWith("B")) {
rateString += "B";
}
rateString += "/s";
}
return rateString;
}
public static DecimalFormat getFormat(double value)
{
DecimalFormat format;
if (value < 10) {
// show up to two decimals to get 3 significant digits
format = new DecimalFormat("#.##");
}
else if (value < 100) {
// show up to one decimal to get 3 significant digits
format = new DecimalFormat("#.#");
}
else {
// show no decimals -- we have enough digits in the integer part
format = new DecimalFormat("#");
}
format.setRoundingMode(RoundingMode.HALF_UP);
return format;
}
}