我发现7-zip很好用,想在.NET应用程序中使用它。 我有一个10MB的文件(a.001),它需要:
2秒钟进行编码。
如果我能在C#上做同样的事情就太好了。我已经下载了http://www.7-zip.org/sdk.html LZMA SDK c#源代码。我基本上将CS目录复制到Visual Studio的控制台应用程序中:
然后我编译了一切都顺利。在输出目录中,我放置了大小为10MB的文件a.001
。在源代码的主方法中,我放置了:
[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://dev59.com/FXVC5IYBdhLWcg3wpjB8#8775927 的方法,但它也需要很长时间。为什么它比实际程序慢10倍?此外,
即使我设置仅使用一个线程:
![enter image description here](https://istack.dev59.com/DdSd9.webp)
(编辑)另一种可能性
这是因为C#比汇编语言或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++慢了多少。这两个程序都是在Visual Studio外部的发布模式下运行的。也许这就是为什么在.net中需要比c ++更长时间的原因。
我得到了相同的结果。 就像我刚刚展示的例子一样,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");
}