Re: А как бы вы написали?
От: Jolly Roger  
Дата: 19.12.09 07:03
Оценка: 12 (1)
Здравствуйте, 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();
        }
    }
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.