1

それは、データのサーバー (速度) 変換に最適ですか?

パフォーマンスを向上させるために変更できますか?

これは、パケット データを設定/取得するためにパケット パーサーで使用されます。

void Packet::setChar(char val, unsigned int offset)
{
    raw[offset + 8] = val;
}

short Packet::getChar(unsigned int offset)
{
    return raw[offset + 8];
}

void Packet::setShort(short val, unsigned int offset)
{
    raw[offset + 8] = val & 0xff;
    raw[offset + 9] = (val >> 8)  & 0xff;
}

short Packet::getShort(unsigned int offset)
{
    return (short)((raw[offset + 9]&0xff) << 8) | (raw[offset + 8]&0xff);
}

void Packet::setInt(int val, unsigned int offset)
{
    raw[offset + 8] = val & 0xff;
    raw[offset + 9] = (val >> 8)  & 0xff;
    raw[offset + 10] = (val >> 16) & 0xff;
    raw[offset + 11] = (val >> 24) & 0xff;
}

int Packet::getInt(unsigned int offset)
{
    return (int)((raw[offset + 11]&0xff) << 24) | ((raw[offset + 10]&0xff) << 16) | ((raw[offset + 9]&0xff) << 8) | (raw[offset + 8]&0xff);
}

クラス定義:

class Packet
{
    public:
        Packet(unsigned int length);
        Packet(char * raw);
        ///header

        void setChar(char val, unsigned int offset);
        short getChar(unsigned int offset);

        void setShort(short val, unsigned int offset);
        short getShort(unsigned int offset);

        void setInt(int val, unsigned int offset);
        int getInt(unsigned int offset);

        void setLong(long long val, unsigned int offset);
        long getLong(unsigned int offset);

        char * getRaw();

        ~Packet();
    protected:
    private:
        char * raw;
};

@EDIT 追加されたクラス定義 Char raw はパケット (新しい char) で初期化されます。

4

2 に答える 2

1

「問題があることが示されていない場合は、変更しないでください」というコメントに同意します。

ハードウェアがリトル エンディアンで、かつオフセットが常にアラインされているか、プロセッサがアラインされていないアクセス (x86 など) をサポートしていることがわかっている場合は、項目全体を 1 回の移動で格納するだけで、より大きなデータ型の設定を高速化できます。 (そして、おそらく「未定義だ」と言う人がいるでしょう。未定義である可能性もありますが、これを正しく行わないコンパイラはまだ見たことがありません。さまざまな型で行うのはかなり一般的なことだからです。コードの)。

だから、このようなもの:

void Packet::setInt(int val, unsigned int offset)
{
    int *ptr = static_cast<int*>(&raw[offset + 8]); 
    *ptr = val;
}

void Packet::getInt(int val, unsigned int offset)
{
    int *ptr = static_cast<int*>(&raw[offset + 8]); 
    return *ptr;
}

私が絶対に行うもう1つのことは、関数がヘッダーファイルに存在することを確認して、コンパイラーが関数をインライン化する選択肢を持つようにすることです。これにより、関数内のコードをいじるよりも多くの利点が得られる可能性が高くなります。これは、関数を呼び出すことと関数をインラインで使用できることのオーバーヘッドが非常に顕著になるためです。それが私の最初のステップです-そもそもそれが問題だと思うと仮定して。ほとんどの場合、データをバッファに詰め込むことは、データ パケット送信の「遅い部分」ではありません。それは、コンテンツの形成、または他のマシンにワイヤを渡すバイトのいずれかです (2 つのうちどちらがラインの速さ、そもそもデータを準備するためにどのような計算が行われるかなど)。

于 2013-08-30T19:54:52.750 に答える