Здравствуйте, Sinix, Вы писали:
S>Внимание вопрос:
S>Из какого места у товарищей растут руки, если мой абсолютно не оптимизированный код на паре тысяч мелких файлов выигрывает от %10 у кода из библиотеки VB и до 150% (30 сек vs 2 мин) у фара???
Боюсь, Ваш тест не вполне корректен. После каждого теста следовало бы перезагружать машину, дабы гарантированно сбросить файловый кэш системы.
S>А как бы вы написали?
Что-нибудь вроде этого
public interface ICopyControl
{
bool CanCopyFile(string source, string dest);
bool CanCopyDir(string source, string dest);
}
class Program
{
public static EventWaitHandle completeEvent =
new EventWaitHandle(false, EventResetMode.AutoReset);
public static int ItemsCount;
public static void Copy(
string sourceDir, string destDir, ICopyControl copyControl)
{
try
{
if (!Directory.Exists(destDir)) Directory.CreateDirectory(destDir);
var dirs = Directory.GetDirectories(sourceDir);
var dest = destDir + "\\";
for (int i = 0; i < dirs.Length; )
{
var src = dirs[i++];
var dst = dest + src.Substring(sourceDir.Length);
if (copyControl == null || copyControl.CanCopyDir(src, dst))
{
Interlocked.Increment(ref ItemsCount);
ThreadPool.QueueUserWorkItem((o) =>
{
Copy(src, dst, copyControl);
});
}
}
var files = Directory.GetFiles(sourceDir);
for (int i = 0; i < files.Length; )
{
var srcF = files[i++];
var dstF = dest + srcF.Substring(sourceDir.Length);
if (copyControl == null || copyControl.CanCopyFile(srcF, dstF))
{
File.Copy(srcF, dstF);
}
}
}
finally
{
if (Interlocked.Decrement(ref ItemsCount) == 0) completeEvent.Set();
}
}
public static void TestCopy(string sourceDir, string destDir)
{
if (!Directory.Exists(sourceDir)) return;
completeEvent.Reset();
Thread.VolatileWrite(ref ItemsCount, 1);
Copy(sourceDir, destDir, null);
completeEvent.WaitOne();
}
static void Main(string[] args)
{
TestCopy(@"K:\A1", @"K:\B1");
Console.WriteLine("Complete");
Console.ReadKey();
}
}