Вопрос про расход ресурсов

DocSpoc

Client
Регистрация
04.01.2016
Сообщения
285
Благодарностей
169
Баллы
43
Привет.
Дано: есть диреткория в которой 3000 папок и 10 файлов в каждой папке. Нужно при одном выполнении проекта выбрать один случайный файл из случайной папки.
Как думаете, что менее накладно при работе:
- сделать список с путями ко всем файлов из папок внутри директории, потом его к списку в ЗП подключать и выбирать одну строку рандомно
- на лету получать список папок внутри диретории, потом случайно выбирать случайную папку и потом случайный файл из этой папки

Текстовый файл со списком получается чуть больше 1 мегабайта.
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 340
Благодарностей
9 088
Баллы
113
Есть еще один вариант:

103201
 
  • Спасибо
Реакции: Alexmd и DocSpoc

DocSpoc

Client
Регистрация
04.01.2016
Сообщения
285
Благодарностей
169
Баллы
43

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 340
Благодарностей
9 088
Баллы
113
вот блин. а я велосипед изобретаю))) Спасибо.

Но все таки какой вариант из первых двух предпочтительнее? или пофигу?
Мне кажется третий вариант предпочтительнее.
Но это чисто предположение, тестов я не проводил.
Можете попробовать потестировать многопоточную работу по всем вариантам отслеживая загруженность процессора например. Потом расскажете - интересно. :-)
 
  • Спасибо
Реакции: Alexmd

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113
Пишу ради подписки на результаты теста. Тоже интересно
Ну и чтоб не с пустыми руками

C#:
//второй вариант
return new DirectoryInfo(@"D:\тут путь к папке").EnumerateDirectories().Shuffle().First().EnumerateFiles("*").Shuffle().First().FullName;

//третий вариант
return new DirectoryInfo(@"D:\тут путь к папке").EnumerateFiles("*", SearchOption.AllDirectories).Shuffle().First().FullName;

В результате потестировал сам.
Параллельный запрос 100000 раз. машина на 24 ядра
Второй вариант, предложенный мной отработал несколько раз за промежуток 10-12 секунд
Третий вариант, предложенный мной никуда не годится: 2 с половиной минуты с первого раза.
Осталось разобраться, как работает внутри вариант предложенный sergodjan66

Прилагаю сниппеты для замера скорости
C#:
////второй вариант
var st = System.Diagnostics.Stopwatch.StartNew();
System.Threading.Tasks.Parallel.For(0,100000, x =>{
    project.SendInfoToLog(new DirectoryInfo(@"D:\тут путь к папке").EnumerateDirectories().Shuffle().First().EnumerateFiles("*").Shuffle().First().FullName, true);
});
return st.Elapsed;

//третий вариант

var st = System.Diagnostics.Stopwatch.StartNew();
System.Threading.Tasks.Parallel.For(0,100000, x =>{
    project.SendInfoToLog(new DirectoryInfo(@"D:\тут путь к папке").EnumerateFiles("*", SearchOption.AllDirectories).Shuffle().First().FullName, true);
});
return st.Elapsed;
 
Последнее редактирование:
  • Спасибо
Реакции: Sergodjan

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)