我正在尝试在我的公司中使用 flatbuffers 作为原始结构的替代品。我们需要序列化的类相当大,我注意到 flatbuffer 序列化的开销超过了我们在运行调试构建时所能承受的。
我用以下简单的测试程序复制了我的发现(数据类型类似于我们生产代码中的数据类型):
#include "stdafx.h"
#include <flatbuffers/flatbuffers.h>
#include "footprints_generated.h"
#include <vector>
#include <iostream>
#include <chrono>
using namespace Serialization::Dummy::FakeFootprints;
flatbuffers::FlatBufferBuilder builder;
flatbuffers::Offset<XYZData> GenerateXYZ()
{
    return CreateXYZData(builder,
        1.0,
        2.0,
        3.0,
        4.0,
        5.0,
        6.0,
        7.0,
        8.0,
        9.0,
        10.0,
        11.0,
        12.0,
        13.0,
        14.0,
        15.0,
        16.0,
        17.0,
        18.0,
        19.0,
        20.0);
}
flatbuffers::Offset<Fake> GenerateFake()
{
    std::vector<flatbuffers::Offset<XYZData>> vec;
    for(int i = 0; i < 512; i++)
    {
        vec.push_back(GenerateXYZ());
    }
    auto XYZVector = builder.CreateVector(vec);
    return CreateFake(builder,
        1.0,
        2.0,
        3.0,
        4.0,
        5.0,
        6.0,
        7.0,
        8.0,
        9.0,
        10.0,
        XYZVector);
}
int main()
{
    auto start = std::chrono::steady_clock::now();
    for(auto i = 0; i < 1000; i++)
    {
        auto fake = GenerateFake();
    }
    auto end = std::chrono::steady_clock::now();
    auto diff = end - start;
    std::cout << std::chrono::duration <double, std::milli>(diff).count() << " ms" << std::endl;
    std::string dummy;
    std::cin >> dummy;
}
在我的电脑上调试大约需要 40 秒(发布时大约需要 400 毫秒)。我正在寻找任何方法来提高调试版本的性能。分析表明大部分时间都花在了 std::vector 代码上,所以我尝试将 _ITERATOR_DEBUG_LEVEL 设置为零,但这并没有带来任何显着的性能提升。