c++ - 最快的碱基转换方法?

标签 c++ base

现在我正在从事一个项目,该项目需要每秒多次将整数转换为 base 62 字符串。这种转换完成得越快越好。

问题是我很难让自己的基本转换方法变得快速可靠。如果我使用字符串,它通常是可靠的并且运行良好,但速度很慢。如果我使用 char 数组,它通常要快得多,但它也非常困惑且不可靠。 (它会产生堆损坏,比较应该匹配的字符串会返回负值等)

那么从一个非常大的整数转换为 base 62 key 的最快和最可靠的方法是什么?将来,我计划在我的应用程序中使用 SIMD 模型代码,那么这个操作是否可以并行化?

编辑:这个操作每秒执行几百万次;一旦操作完成,它将作为循环的一部分再次开始,因此运行得越快越好。被转换的整数是任意大小的,很容易达到 128 位整数(或更大)。

编辑:这是我目前正在使用的功能。

char* charset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int charsetLength = (int)(strlen(charset));

//maxChars is an integer specifying the maximum length of the key
char* currentKey = new char[maxChars];

void integerToKey(unsigned long long location)
{
    unsigned long long num = location;
    int i = 0;

    for(; num > 0; i++)
    {
            currentKey[i] = charset[num % (charsetLength)];
            num /= charsetLength + 1;
    }

    currentKey[i + 1] = '\0';
}

我从我的应用程序的一个类中删除了它,并且修改了一些代码,使其在没有其所属类的情况下有意义。

最佳答案

可能您需要的是某个版本的 itoa。这是一个链接,显示了带有性能测试的 itoa 的各种版本: http://www.strudel.org.uk/itoa/

一般来说,我知道有两种方法可以做到这一点。它执行连续除法以一次剥离一个数字的一​​种方法。另一种方法是预先计算“ block ”中的转换。因此,您可以预先计算一个 int block 到大小为 62^3 的文本转换,然后一次执行数字 3。如果您有效地进行内存布局和查找,这在运行时可能会稍微快一些,但会导致启动损失。

关于c++ - 最快的碱基转换方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1235371/

相关文章:

c++ - 头文件问题; "redefinition of class"

c++ - 最大数 < x?

r - 有没有办法在基数 R 的原点绘制单个原点符号?

python - 在 Python 中从十进制转换为任意基数

c++ - FlatBuffers:写入和读取二进制文件?

c++ - 将字段声明为 const 调用 "function operator=(const memAddress &) cannot be referenced -- it is a deleted function"

asp.net-mvc - 更改 MVC4 上的基本 View 类型

c++ - 当条件太高时循环使用类函数错误

Android:ListView 进行搜索过滤