gpt4 book ai didi

java - Integer.toString(myInt).getBytes(US_ASCII) 是否有更快的替代方案?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:27:37 26 4
gpt4 key购买 nike

用户向我发送 byte/short/int/long 值。我必须将它作为 POST HTTP 请求的一部分发送,并且我必须将数字作为字符串发送。

所以现在我做下一个:

//simplified version
byte[] data = Integer.toString(myInt).getBytes(US_ASCII);
sendPost(data);

我正在为

寻找更快的替代方案
Integer.toString(myInt).getBytes(US_ASCII);

因为这个流程创建了 char[]Stringbyte[] 对象。而我只需要 byte[]。我想知道是否有更快/更好的替代方案。

最佳答案

这个解决方案非常简单。

import java.util.Arrays; // Needed only for demo purposes

public class LongToBytes
{
private static final byte ZERO = '0';
private static final byte MINUS = '-';

public static byte[] convert(long value)
{
// -------------------------------------
// Manage some particular value directly
// abs(Long.MIN_VALUE) remains negative
// -------------------------------------
if ((value >= 0) && (value < 10))
return (new byte[]{(byte)(ZERO + value)});
else if ((value > -10) && (value < 0))
return (new byte[] {MINUS, (byte)(ZERO - value)});
else if (value == Long.MIN_VALUE)
return (Long.toString(value).getBytes());

// -----------------------------------------------------------------
// Initialize result
// The longest value (Long.MIN_VALUE+1) is composed of 20 characters
// -----------------------------------------------------------------
byte[] array;
array = new byte[20];

// ---------------------------
// Keep track of eventual sign
// ---------------------------
boolean negative;
negative = (value < 0);
if (negative)
value = -value;

// ----------------------
// Fill array (backwards)
// ----------------------
int size;
size = 0;
while (value > 0)
{
array[size] = (byte)((value % 10) + ZERO);
size++;
value /= 10;
}

// -------------------
// Add sign eventually
// -------------------
if (negative)
{
array[size] = MINUS;
size++;
}

// -------------------------------------------------------------
// Compose result, giving it the correct length and reversing it
// -------------------------------------------------------------
byte[] result;
int counter;
result = new byte[size];
for (counter = 0; counter < size; counter++)
result[size - counter - 1] = array[counter];

// ----
// Done
// ----
return (result);

} // convert

public static void main(String[] args)
{
try
{
long value;
value = Long.parseLong(args[0]);
System.out.println(value);
System.out.println(Arrays.toString(convert(value)));
}
catch (Exception exception)
{
exception.printStackTrace();
}
}

} // class LongToBytes

更新
我使用 Long.toString().getBytes() 作为秒表,在超过 100.000.000 的循环中分别检查了两种调用方式(上面的方法和 System.nanoTime() )的性能。

传0,上面的方法大约快500倍。
相对较小的值(介于 -10.000 和 10.000 之间)的增益约为 60%。
巨大的值(接近 Long.MIN_VALUE 和 Long.MAX_VALUE)有大约 40% 的增益。

更新 2
分别管理特定值(介于 -9 和 9 之间以及值 Long.MIN_VALUE),情况会稍微好一些。
我更新了方法的实现。

关于java - Integer.toString(myInt).getBytes(US_ASCII) 是否有更快的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57819722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com