弦のパフォーマンスに関する質問はいくらでもありますが、最適なアプローチが何であるかについてはまだ頭も尻尾もわかりません。
簡単に言うと、私は 4NT から PowerShell に移行することを約束しました。4NT を離れると、FFIND と呼ばれるコンソールの超高速文字列検索ユーティリティが恋しくなります。初歩的な C# プログラミング スキルを使用して、PowerShell で使用する独自のユーティリティを作成することにしました。
これまでのところ、いくつかの 1000 個のファイルにまたがる数百個のディレクトリでの文字列検索の検索結果は、非常に大きいものもあり、FFIND 2.4 秒であり、私のユーティリティは 4.4 秒です。 ?
初めてFFINDを実行したときはほぼ同時に実行されますが、私の場合は1分以上かかりますか? これは何ですか?ライブラリのロード?ファイルの索引付け? コードで何か間違ったことをしていますか? もう少し待つことは気にしませんが、違いは非常に大きいので、より良い言語やアプローチがあれば、投資しすぎる前に今すぐその道を歩み始めたいと思います.
高速な文字列検索を作成するには、別の言語を選択する必要がありますか?
このユーティリティを使用して、1000 個のファイルから Web コード、C# コード、およびテキスト ファイルを使用する別の固有言語の文字列を検索する必要があります。また、このユーティリティを使用して、非常に大きなログ ファイル (MB サイズ) 内の文字列を検索できるようにする必要もあります。
class Program
{
public static int linecounter;
public static int filecounter;
static void Main(string[] args)
{
//
//INIT
//
filecounter = 0;
linecounter = 0;
string word;
// Read properties from application settings.
string filelocation = Properties.Settings.Default.FavOne;
// Set Args from console.
word = args[0];
//
//Recursive search for sub folders and files
//
string startDIR;
string filename;
startDIR = Environment.CurrentDirectory;
//startDIR = "c:\\SearchStringTestDIR\\";
filename = args[1];
DirSearch(startDIR, word, filename);
Console.WriteLine(filecounter + " " + "Files found");
Console.WriteLine(linecounter + " " + "Lines found");
Console.ReadKey();
}
static void DirSearch(string dir, string word, string filename)
{
string fileline;
string ColorOne = Properties.Settings.Default.ColorOne;
string ColorTwo = Properties.Settings.Default.ColorTwo;
ConsoleColor valuecolorone = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), ColorOne);
ConsoleColor valuecolortwo = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), ColorTwo);
try
{
foreach (string f in Directory.GetFiles(dir, filename))
{
StreamReader file = new StreamReader(f);
bool t = true;
int counter = 1;
while ((fileline = file.ReadLine()) != null)
{
if (fileline.Contains(word))
{
if (t)
{
t = false;
filecounter++;
Console.ForegroundColor = valuecolorone;
Console.WriteLine(" ");
Console.WriteLine(f);
Console.ForegroundColor = valuecolortwo;
}
linecounter++;
Console.WriteLine(counter.ToString() + ". " + fileline);
}
counter++;
}
file.Close();
file = null;
}
foreach (string d in Directory.GetDirectories(dir))
{
//Console.WriteLine(d);
DirSearch(d,word,filename);
}
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}