7

FPGA からデータを出力するプログラムがあります。データは非常に高速に変更されるため、プログラムの速度を上げようとしています。今、私はこのようなデータを印刷しています

for (int i = 0; i < 100; i++) {
    printf("data: %d\n",getData(i));
}

1つのprintfを使用すると速度が大幅に向上することがわかりました

printf("data: %d \n data: %d \n data: %d \n",getData(1),getData(2),getData(3));

ただし、ご覧のとおり、非常に面倒で、for ループを使用できません。最初に文字列を連結してsprintfから、すべてを一度に出力しようとしましたが、最初の方法と同じくらい遅いです。助言がありますか?

編集:コンソールのスクロールが問題になることに気付いたので、最初にファイルに出力しています。しかし、それでも遅すぎます。外部 FPGA のメモリ コントローラーをデバッグしているので、実際の速度に近いほど良いです。

4

5 に答える 5

6

stdout に書き込んでいる場合、このすべてに影響を与えることはできないかもしれません。

それ以外の場合は、バッファリングを設定します

現在、Boost Karma はかなりのパフォーマンスを発揮することが知られています。ただし、入力データについて詳しく知る必要があります。

その間、書き込みを手動でバッファリングしてみてください:

#include <stdio.h>

int getData(int i) { return i; }

int main()
{
    char buf[100*24]; // or some other nice, large enough size
    char* const last = buf+sizeof(buf);
    char* out = buf;

    for (int i = 0; i < 100; i++) {
        out += snprintf(out, last-out, "data: %d\n", getData(i));
    }

    *out = '\0';
    printf("%s", buf);
}
于 2013-08-23T21:42:18.943 に答える
4

うわー、私は以前にこれをしなかったなんて信じられない.

const int size = 100;
char data[size];
for (int i = 0; i < size; i++) {
    *(data + i) = getData(i);
}

for (int i = 0; i < size; i++) {
    printf("data: %d\n",*(data + i));
}

私が言ったようprintfに、ボトルネックであり、sprintfあまり改善されていませんでした. そのため、最後まで印刷を一切行わず、代わりにポインターを使用することにしました。

于 2013-09-05T20:11:19.593 に答える
0

テキストをバッファにフォーマットしてから、fwrite関数を使用してバッファを書き込むことをお勧めします。

dasblinkenlight の回答から構築し、fwrite代わりに を使用しputsます。puts関数は、終端のヌル文字を検索しています。fwrite関数はそのままコンソールに書き込みます 。

char buf[] = "data: 0000000000\r\n";
for (int i = 0; i < 100; i++) {
    // int portion starts at position 6
    itoa(getData(i), &buf[6], 10);

    // The -1 is because we don't want to write the nul character.
    fwrite(buf, 1, sizeof(buf) - 1, stdout);
}

すべてのデータを個別の生データ バッファーに読み込み、生データを "フォーマット済み" データ バッファーにフォーマットし、最後に 1 回のfwrite呼び出しで "フォーマット済み" データ バッファー全体をブラストすることができます。

関連するオーバーヘッドがあるため、データを送信するための呼び出しを最小限に抑える必要があります。fwrite関数が 1 文字を書き込む場合のオーバーヘッドは、10,000 文字を書き込む場合とほぼ同じです。ここでバッファリングの出番です。アイテムの 1024 バッファを使用すると、1 つの関数呼び出しを使用して 1024 アイテムを書き込むのに対して、1024 呼び出しでそれぞれ 1 つのアイテムを書き込むことになります。後者は 1023 回の余分な関数呼び出しです。

于 2013-08-23T23:26:32.390 に答える