字符串格式化的性能比较?

C++语言 码拜 9年前 (2015-10-08) 968次浏览

string format0(const char* format, va_list ap) {
    string str;
    char* pBuf = (char*)malloc(102400);
    if (pBuf != NULL) {
        vsnprintf(pBuf, 102400, format, ap);
        str = string(pBuf);
        free(pBuf);
    }
    return str;
}


string format1(cstArrChar format, va_list vl) {
    char charArr[102400] = {};
    vsnprintf(charArr, 102400, format, vl);
    return string(charArr);
}

一个分配在堆上面,一个在栈上面,到底哪种写法比较好呢?

方案推荐指数:1
无profiler不要谈效率!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
方案推荐指数:29
// mystring
struct mystring : std::string {
    // format
    void format(const char* formatstr, ...) /*throw(std::bad_alloc)*/ {
        constexpr size_t BASE_BUFFER_SIZE = 4096;
        constexpr size_t STEP = 16;
        char fixed_buffer[BASE_BUFFER_SIZE];
        auto buf_len = BASE_BUFFER_SIZE;
        auto buf = fixed_buffer;
        va_list vArgList;
        va_start(vArgList, formatstr);
        while (true) {
            auto len = std::vsnprintf(buf, buf_len, formatstr, vArgList);
            if (len >= 0) {
                this->assign(buf, static_cast<size_t>(len));
                break;
            }
            else {
                if (buf != fixed_buffer) std::free(buf);
                if (!(buf = reinterpret_cast<char*>(std::malloc(buf_len *= STEP)))) {
                    throw(std::bad_alloc());
                }
            }
        }
        va_end(vArgList);
        if (buf != fixed_buffer) std::free(buf);
    }
};


int main() {
    try {
        mystring str;
        str.format("ABCD == 0x%p --> %ld", &str, 987654321l);
        std::printf("%s\r\n", str.c_str());
    }
    catch (const std::exception& exp)  {
        std::printf("%s\r\n", exp.what());
    }
    return 0;
}

就多几行代码, 增加易用性.何乐而不为


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明字符串格式化的性能比较?
喜欢 (0)
[1034331897@qq.com]
分享 (0)