1

これについて高低を検索しましたが、決定的な答えを見つけることができませんでした。私はアプリケーションの設計を始めたばかりで、データベースに Postgresql を使用し、サーバーに C を使用することにしました。ただし、一部の初期テストでは、紛らわしい数値が示されています。テキスト文字列を介してデータベースにアクセスするのが最速の方法のように思えますが、これは直感に反するように思えます。確かに、データベースは int と float をバイナリとして内部的に保存しており、それらを変換してテキストとして表示する必要があります。使用するには、バイナリに変換する必要があります。より速いルートは、すべてをバイナリのままにしておくことだと思われますが、今日まで、この利点を示すためにバイナリアクセスを取得できないようです。

これは、私が見ているものを示すために作成した簡単なテストケースです(スキーマ+コード)

http://pastebin.com/1AhB8avx

そして、私はこのようなタイミングを見ています:

反復 0 を開始しています... 反復 0: PQparamExec を介して 35 秒で 50000 のバイナリ レコードをフェッチしました 反復 0: PQexecf を介して 34 秒で 50000 のバイナリ レコードをフェッチしました 反復 0: PQexec を介して 25 秒で 50000 のテキスト レコードをフェッチしました

追加の反復は、そのパターンを多かれ少なかれ繰り返すだけです。libpq を直接使用して同様の結果を得ることも試みましたが、このテスト ケースには移植しませんでした。

これはあなたの経験と一致していますか、それとも私はどこかで愚かなだけですか?

ありがとう!

4

1 に答える 1

2

これには理由がないようです。実際、ubuntu デスクトップでコードを実行すると、そのような違いはありません。

反復 0 を開始しています...
反復 0: PQparamExec を介して 13 秒で 50000 のバイナリ レコードをフェッチ
反復 0: 13 秒で PQexecf を介して 50000 のバイナリ レコードをフェッチ
反復 0: PQexec を介して 12 秒で 50000 のテキスト レコードをフェッチ

反復 1 を開始しています...
反復 1: PQparamExec を介して 13 秒で 50000 のバイナリ レコードをフェッチ
繰り返し 1: PQexecf を介して 14 秒で 50000 のバイナリ レコードをフェッチ
反復 1: PQexec を介して 12 秒で 50000 のテキスト レコードをフェッチ

イテレーション 2 を開始しています...
繰り返し 2: PQparamExec を介して 12 秒で 50000 のバイナリ レコードをフェッチ
イテレーション 2: PQexecf を介して 13 秒で 50000 のバイナリ レコードをフェッチ
反復 2: PQexec を介して 11 秒で 50000 のテキスト レコードをフェッチ

反復 3 を開始しています...
反復 3: PQparamExec を介して 12 秒で 50000 のバイナリ レコードを取得
反復 3: PQexecf を介して 12 秒で 50000 のバイナリレコードをフェッチ
反復 3: PQexec を介して 12 秒で 50000 のテキスト レコードをフェッチ

反復 4 を開始しています...
繰り返し 4: PQparamExec を介して 13 秒で 50000 のバイナリ レコードをフェッチ
反復 4: PQexecf を介して 12 秒で 50000 のバイナリレコードをフェッチ
反復 4: PQexec を介して 12 秒で 50000 のテキスト レコードをフェッチ

コードはtime()経過時間を測定するために 2 回呼び出しているため、精度は 2 秒であり、このコンテキストでは少し高いことに注意してください。gettimeofday()代わりに、またはより良いclock_gettime()を検討する必要がありCLOCK_PROCESS_CPUTIME_IDます。

于 2012-12-12T00:03:13.993 に答える