1

生の構造体の代わりとして、社内でフラットバッファの使用を実験しています。シリアル化する必要があるクラスはかなり大きく、フラットバッファのシリアル化のオーバーヘッドは、デバッグ ビルドを実行するときに取り得る以上のものであることに気付きました。

次の簡単なテスト プログラムを使用して、自分の発見を再現しました (データ型は、製品コードのデータ型に似ています)。

#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;
}

デバッグで私のPCで実行するのに約40秒かかります(リリースで約400ms)。デバッグ ビルドのパフォーマンスを向上させる方法を探しています。プロファイリングでは、ほとんどの時間が std::vector コードに費やされていることが示されたので、_ITERATOR_DEBUG_LEVEL をゼロに設定してみましたが、パフォーマンスが大幅に向上することはありませんでした。

4

2 に答える 2

0

ベクターでを使用していることに気付きpush_back()ましたが、 への呼び出しが見当たりませんreserve()。したがって、コードはヒープ割り当てに多くの時間を費やしている可能性があります。vec.reserve(512)を呼び出すループに入る前に入れることをお勧めしますGenerateXYZ()

于 2016-03-18T13:16:41.107 に答える