Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 | 4 | 5 |

 

  Вопрос: Выношу на суд. Добавлено: 01.03.09 09:40  

Автор вопроса:  Smith | Web-сайт: Не хочу ломать голову, если её уже сломал кто-то другой. | ICQ: ненавижу 

Ответить

  Ответы Всего ответов: 61  

Номер ответа: 31
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #31 Добавлено: 02.03.09 06:56
Мужики для справки

Первый поиск по диску в 500ГБ забитому на 421Гб с 54000 файлов и 7000 папок проходит за 41 секунду
Повторный поиск проходит всего за 9 сек.

Ответить

Номер ответа: 32
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #32 Добавлено: 02.03.09 07:09
Я как раз и думал, может написать всё самому, вызывать апи, пусть и с учетом размера, но всё равно должно быть хоть на 10 сек. быстрее если моя реализация и вб6 не испортят всю малину )

Ответить

Номер ответа: 33
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #33 Добавлено: 02.03.09 07:12
Но опять, стоят ли эти 10-15 сек. этого гемороя. В конечном итоге действительно всё упирается в железо.

Ради интереса попрошу брата на рабочем серваке со сказёвыми винтами проверить мою прогу )

Ответить

Номер ответа: 34
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #34 Добавлено: 02.03.09 07:25
Smith пишет:
Brand, это ты о его примерчике мультитрединга на ВБ6 для митуя?
Я тоже его видел, пример был полон неожиданностей.

Ты про какие неожиданности? Касперский ругался? :)

Ответить

Номер ответа: 35
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #35 Добавлено: 02.03.09 07:38
Это я каспером пользуюсь?! Вот не надо меня оскорблять )
Нет пример был неплохой и довольной простой, но в оригинале он глючил/вылетал, а разбираться я и не пытался

Ответить

Номер ответа: 36
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #36 Добавлено: 02.03.09 10:16
для меня размер предмет гордости

Smith, а ты уверен, что мы говорим об одном и том же размере? Я имел ввиду размер папки, а ты каким размером гордишься?

Ответить

Номер ответа: 37
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #37 Добавлено: 02.03.09 10:29
Program.cs
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4.  
  5. namespace ConsoleApplication1
  6. {
  7.     public class Program
  8.     {
  9.         static int folderCount;
  10.         static List<string> emptyFolders;
  11.  
  12.         static void Main(string[] args)
  13.         {
  14.             for (int i = 0; i < 3; i++)
  15.             {
  16.                 folderCount = 0;
  17.                 emptyFolders = new List<string>();
  18.                 DateTime Start = DateTime.Now;
  19.                 SearchEmptyDirectories(@"C:\");
  20.                 TimeSpan time = DateTime.Now.Subtract(Start);
  21.                 Console.WriteLine("{0} пустых папок из {1}: Время: {2}", emptyFolders.Count, folderCount, time);
  22.             }
  23.             Console.ReadLine();
  24.         }
  25.  
  26.         static void SearchEmptyDirectories(string directoryPath)
  27.         {
  28.             folderCount++;
  29.             bool isEmpty = false;
  30.             string[] directories = Kernel32.GetDirectories(directoryPath,out isEmpty);
  31.             if (!isEmpty)
  32.                 foreach (string directory in directories)
  33.                     SearchEmptyDirectories(directory);
  34.             else
  35.                 emptyFolders.Add(directoryPath);
  36.         }
  37.     }
  38. }


Kernel32.cs
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Runtime.InteropServices;
  6.  
  7. namespace ConsoleApplication1
  8. {
  9.     public class Kernel32
  10.     {
  11.         #region Win32 API Declaration
  12.         const int MAX_PATH = 260;
  13.         const int MAX_ALTERNATE = 14;
  14.         static IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
  15.  
  16.         [StructLayout(LayoutKind.Sequential)]
  17.         struct FILETIME
  18.         {
  19.             public uint dwLowDateTime;
  20.             public uint dwHighDateTime;
  21.         };
  22.  
  23.         [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
  24.         struct WIN32_FIND_DATA
  25.         {
  26.             public FileAttributes dwFileAttributes;
  27.             public FILETIME ftCreationTime;
  28.             public FILETIME ftLastAccessTime;
  29.             public FILETIME ftLastWriteTime;
  30.             public int nFileSizeHigh;
  31.             public int nFileSizeLow;
  32.             public int dwReserved0;
  33.             public int dwReserved1;
  34.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
  35.             public string cFileName;
  36.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_ALTERNATE)]
  37.             public string cAlternate;
  38.         }
  39.  
  40.         [DllImport("kernel32", CharSet = CharSet.Unicode)]
  41.         static extern IntPtr FindFirstFile(string lpFileName, out WIN32_FIND_DATA lpFindFileData);
  42.  
  43.         [DllImport("kernel32", CharSet = CharSet.Unicode)]
  44.         static extern bool FindNextFile(IntPtr hFindFile, out WIN32_FIND_DATA lpFindFileData);
  45.  
  46.         [DllImport("kernel32", SetLastError = true)]
  47.         static extern bool FindClose(IntPtr hFindFile);
  48.         #endregion
  49.  
  50.         public static bool IsEmptyDirectory(string directoryPath)
  51.         {
  52.             directoryPath = (directoryPath.EndsWith(@"\*")) ? directoryPath : directoryPath += @"\*";
  53.             WIN32_FIND_DATA findData;
  54.             IntPtr hFindFile = FindFirstFile(directoryPath, out findData);
  55.             if (hFindFile != INVALID_HANDLE_VALUE)
  56.             {
  57.                 do
  58.                 {
  59.                     string fileName = findData.cFileName;
  60.                     if (fileName != "." && fileName != "..")
  61.                     {
  62.                         FindClose(hFindFile);
  63.                         return false;
  64.                     }
  65.                 } while (FindNextFile(hFindFile, out findData));
  66.             }
  67.             FindClose(hFindFile);
  68.             return true;
  69.         }
  70.  
  71.         public static string[] GetDirectories(string directoryPath, out bool isEmpty)
  72.         {
  73.             List<string> directories = new List<string>();
  74.             WIN32_FIND_DATA findData;
  75.             IntPtr hFindFile = FindFirstFile((directoryPath.EndsWith(@"\*")) ? directoryPath : directoryPath + @"\*", out findData);
  76.             isEmpty = true;
  77.             if (hFindFile != INVALID_HANDLE_VALUE)
  78.             {
  79.                 do
  80.                 {
  81.                     string directoryName = findData.cFileName;
  82.                     if (directoryName != "." && directoryName != "..")
  83.                     {
  84.                         isEmpty = false;
  85.                         if ((findData.dwFileAttributes & FileAttributes.Directory) != 0)
  86.                             directories.Add(Path.Combine(directoryPath, directoryName));
  87.  
  88.                     }
  89.                 } while (FindNextFile(hFindFile, out findData));
  90.             }
  91.             return directories.ToArray();
  92.         }
  93.     }
  94. }



Результат

1703 пустых папок из 14566: Время: 00:00:09.2512574
1703 пустых папок из 14566: Время: 00:00:05.0468750
1703 пустых папок из 14566: Время: 00:00:05.0937500

Ответить

Номер ответа: 38
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #38 Добавлено: 02.03.09 10:33
EROS, довольно интересный вариант с объединением двух операций в одном цикле (обход дирректорий и проверка пустоты папки).
Интересно, насколько дольше будет выполняться код, если разделить эти 2 операции на 2 разные функции? Не пробовал?

Ответить

Номер ответа: 39
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #39 Добавлено: 02.03.09 10:38
Пробовал.. примерно в 2-3 раза..

Ответить

Номер ответа: 40
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #40 Добавлено: 02.03.09 11:45
Это можно перевести в ВБ, но не думаю, что результат будет тотже

Ответить

Номер ответа: 41
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #41 Добавлено: 02.03.09 12:22
Сможешь аргументированно ответить почему?

Ответить

Номер ответа: 42
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #42 Добавлено: 02.03.09 13:06
нет, пока не переведу и не проверю

но думаю разница всётаки есть )

Ответить

Номер ответа: 43
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #43
Добавлено: 02.03.09 21:21
>Это я каспером пользуюсь?! Вот не надо меня оскорблять )
я пользуюсь. А в нем есть что-то плохое?
Мне очень нравятся ежемесячные пробные периоды гыгы)

Ответить

Номер ответа: 44
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #44
Добавлено: 03.03.09 01:25
Я переписал код выше на VB6, только получается очень медленно. Наверное из-за использования коллекций..
Enter path to scan: G:\
506 пустых папок из 8719: Время: 0:01:01
506 пустых папок из 8719: Время: 0:00:01
506 пустых папок из 8719: Время: 0:00:01

Заодно реализовал класс Console=) Вот кот: http://narod.ru/disk/6261878000/empty_folders.7z.html
Посмотрите плз и скажите, почему целую минуту ищет. Хотя может дело в винде?

Ответить

Номер ответа: 45
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #45 Добавлено: 03.03.09 03:06
Я переписал код выше на VB6, только получается очень медленно.

наши результаты нельзя сравнивать.. разные винты разной загруженности с разным временем доступа, разная память, разные процессоры и разное железо. Сравнение надо проводить на одной целевой машине, и то.. это сравнение будет относительным.. разные языки с разной реализаций вызовов api,работой с памятью,коллекциями и т.д.. вполне может случиться так, что vb6 на api'шках будет быстрее net'овской реализации.. я этому не удивлюсь..

Ответить

Страница: 1 | 2 | 3 | 4 | 5 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам