さて、malloc で割り当てた char 配列にバイナリ ファイルを読み込んでいます。(ちなみに、ここのコードは実際のコードではありません。実演のためにその場で書いただけなので、ここでの間違いはおそらく実際のプログラムの間違いではありません。) このメソッドは毎秒約 5000 万バイトで読み取ります。
主要
char *buffer = (char*)malloc(file_length_in_bytes*sizeof(char));
memset(buffer,0,file_length_in_bytes*sizeof(char));
//start time here
read_whole_file(buffer);
//end time here
free(buffer);
read_whole_buffer
void read_whole_buffer(char* buffer)
{
//file already opened
fseek(_file_pointer, 0, SEEK_SET);
int a = sizeof(buffer[0]);
fread(buffer, a, file_length_in_bytes*a, _file_pointer);
}
私が信じているファイルストリームと関数 ReadByte() を使用してファイル全体をバイト単位で読み取るマネージ C++ で同様のものを作成しました。
また、私のコンピュータには sata と IDE ドライブがあり、両方からファイルを読み込んでいますが、まったく違いはありません (SATA は IDE よりもはるかに高速に読み取ると仮定していたので、これは奇妙です) .)
質問
なぜこれが私にとって意味をなさないのか、皆さんは理解できるかもしれません。私の知る限り、バイトごとに読み取るのではなく、ファイル全体を配列に fread する方がはるかに高速です。その上、テストを通じて、マネージ C++ の方が遅いことがわかりました (ただし、コードのベンチマークを行っていて速度が必要な場合にのみ顕著です)。
それで
なぜ私は両方のアプリケーションで同じ速度で読んでいるのか. また、ファイルから配列への 5000 万バイトは高速ですか?
マザーボードがボトルネックになっているのでしょうか?それはあまり意味がないようです。
ファイルを配列に読み込むためのより高速な方法はありますか?
ありがとう。
私の「スクリプトタイマー」
ミリ秒の分解能で開始時間と終了時間を記録します...最も重要なのは、タイマーではないことです
#pragma once
#ifndef __Script_Timer__
#define __Script_Timer__
#include <sys/timeb.h>
extern "C"
{
struct Script_Timer
{
unsigned long milliseconds;
unsigned long seconds;
struct timeb start_t;
struct timeb end_t;
};
void End_ST(Script_Timer *This)
{
ftime(&This->end_t);
This->seconds = This->end_t.time - This->start_t.time;
This->milliseconds = (This->seconds * 1000) + (This->end_t.millitm - This->start_t.millitm);
}
void Start_ST(Script_Timer *This)
{
ftime(&This->start_t);
}
}
#endif
バッファのことを読む
char face = 0;
char comp = 0;
char nutz = 0;
for(int i=0;i<(_length*sizeof(char));++i)
{
face = buffer[i];
if(face == comp)
nutz = (face + comp)/i;
comp++;
}