Я нашел 7-zip отлично, и я хотел бы использовать его в приложениях .net. У меня есть файл размером 10 МБ (a.001), и он принимает:
2 секунды для кодирования.
Теперь будет хорошо, если бы я мог сделать то же самое на С#. Я загрузил http://www.7-zip.org/sdk.html Исходный код LZMA SDK С#. Я в основном копировал каталог CS в консольное приложение в visual studio:
Затем я скомпилировал и eveything скомпилировал плавно. Поэтому в выходной директории я разместил файл a.001
размером 10 МБ. В основном методе, который пришел на исходный код, я разместил:
[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 секунд! Я также пробовал метод qaru.site/info/67202/..., и это также занимает очень много времени. Почему он в 10 раз медленнее, чем реальная программа?
Также
Даже если я решил использовать только один поток:
По-прежнему требуется гораздо меньше времени (3 секунды против 15):
(Изменить) Другая возможность
Может быть, потому, что С# медленнее сборки или 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");
}
Выход
С#
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();
}
Выход
Обратите внимание, насколько медленнее был С#. Обе программы, которые запускаются из-за пределов визуальной студии в режиме выпуска. Возможно, именно по этой причине это занимает намного больше времени в .net, чем на С++.
Также я получил те же результаты. С# был в 3 раза медленнее, как на примере, который я только что показал!
Заключение
Я не могу понять, что вызывает проблему. Думаю, я буду использовать 7z.dll и вызывать необходимые методы из С#. Библиотека, которая делает это: 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");
}