7-zipは素晴らしいと思いました。これを、.netアプリケーションで使用したいと思います。10MBのファイル(a.001)があり、次のようになります。
エンコードするのに2秒。
これで、c#でも同じことができると便利です。http://www.7-zip.org/sdk.html LZMA SDK c#ソースコードをダウンロードしました。基本的に、CSディレクトリをVisualStudioのコンソールアプリケーションにコピーしました。
それから私はコンパイルし、すべてがスムーズにコンパイルされました。そのため、出力ディレクトリにa.001
10MBのサイズのファイルを配置しました。私が配置したソースコードに含まれる主な方法について:
[STAThread]
static int Main(string[] args)
{
// e stands for encode
args = "e a.001 output.7z".Split(' '); // added this line for debug
try
{
return Main2(args);
}
catch (Exception e)
{
Console.WriteLine("{0} Caught exception #1.", e);
// throw e;
return 1;
}
}
コンソールアプリケーションを実行すると、アプリケーションは正常に動作a.7z
し、作業ディレクトリに出力が表示されます。問題は、とても時間がかかることです。実行には約15秒かかります!https://stackoverflow.com/a/8775927/637142アプローチも試しましたが、非常に時間がかかります。実際のプログラムの10倍遅いのはなぜですか?
また
1つのスレッドのみを使用するように設定した場合でも:
それでもはるかに短い時間で済みます(3秒対15):
(編集)別の可能性
C#がアセンブリまたはCよりも遅いためでしょうか?アルゴリズムが多くの重い操作を行うことに気づきました。たとえば、これら2つのコードブロックを比較します。それらは両方とも同じことをします:
C
#include <time.h>
#include<stdio.h>
void main()
{
time_t now;
int i,j,k,x;
long counter ;
counter = 0;
now = time(NULL);
/* LOOP */
for(x=0; x<10; x++)
{
counter = -1234567890 + x+2;
for (j = 0; j < 10000; j++)
for(i = 0; i< 1000; i++)
for(k =0; k<1000; k++)
{
if(counter > 10000)
counter = counter - 9999;
else
counter= counter +1;
}
printf (" %d \n", time(NULL) - now); // display elapsed time
}
printf("counter = %d\n\n",counter); // display result of counter
printf ("Elapsed time = %d seconds ", time(NULL) - now);
gets("Wait");
}
出力
c#
static void Main(string[] args)
{
DateTime now;
int i, j, k, x;
long counter;
counter = 0;
now = DateTime.Now;
/* LOOP */
for (x = 0; x < 10; x++)
{
counter = -1234567890 + x + 2;
for (j = 0; j < 10000; j++)
for (i = 0; i < 1000; i++)
for (k = 0; k < 1000; k++)
{
if (counter > 10000)
counter = counter - 9999;
else
counter = counter + 1;
}
Console.WriteLine((DateTime.Now - now).Seconds.ToString());
}
Console.Write("counter = {0} \n", counter.ToString());
Console.Write("Elapsed time = {0} seconds", DateTime.Now - now);
Console.Read();
}
出力
c#がどれだけ遅いかに注意してください。リリースモードで外部のビジュアルスタジオから実行される両方のプログラム。たぶんそれが、C++よりも.netの方がはるかに長い時間がかかる理由です。
また、同じ結果が得られました。C#は、先ほど示した例と同じように3倍遅くなりました。
結論
何が問題を引き起こしているのかわからないようです。7z.dllを使用して、c#から必要なメソッドを呼び出すと思います。それを行うライブラリは次の場所にあります:http://sevenzipsharp.codeplex.com/ そしてそのように私は7zipが使用しているのと同じライブラリを使用しています:
// dont forget to add reference to SevenZipSharp located on the link I provided
static void Main(string[] args)
{
// load the dll
SevenZip.SevenZipCompressor.SetLibraryPath(@"C:\Program Files (x86)\7-Zip\7z.dll");
SevenZip.SevenZipCompressor compress = new SevenZip.SevenZipCompressor();
compress.CompressDirectory("MyFolderToArchive", "output.7z");
}