Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2017, 15:53   #11
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

От нечего делать переписал поделку:
Код:
private static void ScanDir(StringBuilder info, string intputpath, string tabs = "")
        {
            
            string[] innerPaths;
            try
            {
                innerPaths = Directory.GetDirectories(intputpath);
            }
            catch { return; }

            var addTabs = tabs + '\t';

            foreach (var dir in innerPaths)
            {
                info.Append(tabs);
                info.Append("<DIR> ");
                info.AppendLine(dir);

                ScanDir(info, dir, addTabs);
            }

            try
            {
                innerPaths = Directory.GetFiles(intputpath);
            }
            catch { return; }
            foreach (var file in innerPaths)
            {
                info.Append(tabs);
                info.AppendLine(file);
            }
        }

        static void Main(string[] args)
        {
            var info = new StringBuilder();
            ScanDir(info, @"C:\");
            Console.WriteLine(info);

            Console.ReadKey();
        }
Мой диск С сканирует за 25 секунд примерно. До вывода в консоль занимает ~125 метров памяти. Ничего не падает.
Вариант из первого сообщения я не дождался, долго и печально работает.

UPD. Я думал, что в 2017 году в шарпе уже не увижу глобальные переменные, многопоточность и слипы вместе. Это же дичь дикая. Зачем другой поток какой-то для записи? Пишите сразу в файловый поток через StreamWriter без всяких info, out_data и прочего хлама.

Последний раз редактировалось pu4koff; 10.02.2017 в 16:02.
pu4koff вне форума Ответить с цитированием
Старый 10.02.2017, 16:02   #12
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Я уже писал об этом в том же сообщении
Там не описан результат (из-за 10мс или 15 мб памяти нет смысла это оптимизировать) и способ измерения.

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
string info как раз и предназначен для того, что бы напихивать туда этот хлам.
Речь не о том. Строки неизменяемы, будут создаваться копии.


Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Если БЕЗ оптимизации программа работает ХУЖЕ - то это нормально. ПОСЛЕ оптимизации программа работает лучше
Я про заметность улучшения. Лишние 10мс или 15 мб никто не заметит. Зато баг допущенный из-за сложности кода или более долгое время разработки точно никому не понравится.

Да и может вы так наоптимизировали, что хуже стало
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 10.02.2017 в 16:10.
Alex11223 вне форума Ответить с цитированием
Старый 10.02.2017, 16:18   #13
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Код:
private static void ScanDir(TextWriter writer, string intputPath, string tabs = "")
        {
            string[] innerPaths;
            try
            {
                innerPaths = Directory.GetDirectories(intputPath);
            }
            catch { return; }

            var addTabs = tabs + '\t';

            foreach (var dir in innerPaths)
            {
                writer.Write(tabs);
                writer.Write("<DIR> ");
                writer.WriteLine(dir);

                ScanDir(writer, dir, addTabs);
            }

            try
            {
                innerPaths = Directory.GetFiles(intputPath);
            }
            catch { return; }
            foreach (var file in innerPaths)
            {
                writer.Write(tabs);
                writer.WriteLine(file);
            }
        }

        static void Main(string[] args)
        {
            using (var writer = new StreamWriter(@"D:\test.txt"))
            {
                ScanDir(writer, @"C:\");
            }

            Console.ReadKey();
        }
За 25 секунд, расходуя 25 МБ памяти записало 45МБ текста. Никаких глобальных переменных, слипов, лишних потоков,...
pu4koff вне форума Ответить с цитированием
Старый 10.02.2017, 16:51   #14
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

pu4koff, мне поток нужен что бы не повесить программу и не грузить процессор; за 20 минут работы с задержками между переходами (в 120 миллисекунд) генерируется 10 мегабайт Unicode-текста, и процесс кушает не больше 15 мегабайт. И всё это при сканировании диска D:\, у которого свободно 44 гигабайта из 781
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 10.02.2017 в 17:01.
OmegaBerkut вне форума Ответить с цитированием
Старый 10.02.2017, 17:02   #15
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так для этого не надо вбивать костылями и слипами потоки в ту функцию. Просто ее и выполнять в другом потоке. Если нужно выводить во время работы, то задержку вывода лучше сделать в основном потоке (без остановки работы)

Цитата:
Сообщение от pu4koff Посмотреть сообщение
25 секунд, расходуя 25 МБ памяти записало 45МБ текста
Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
за 20 минут работы с задержками между переходами (в 120 миллисекунд) генерируется 10 мегабайт текста и процесс кушает не больше 15 мегабайт
Отдали кучу времени и значительно усложнили код за экономию пары мб.
Правильной дорогой идете, самое то для 2017 года.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 10.02.2017 в 17:12.
Alex11223 вне форума Ответить с цитированием
Старый 10.02.2017, 17:06   #16
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
pu4koff, мне поток нужен что бы не повесить программу и не грузить процессор; за 20 минут работы с задержками между переходами (в 120 миллисекунд) генерируется 10 мегабайт Unicode-текста, и процесс кушает не больше 15 мегабайт. И всё это при сканировании диска D:\, у которого свободно 44 гигабайта из 781
Так умные люди придумали же Task, async. Да хоть в BackgroundWorker можно запустить и никакие костыли со слипами не нужны.
pu4koff вне форума Ответить с цитированием
Старый 10.02.2017, 17:13   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Что значит вообще не принято ? Откуда категория и категоричность ?
Цитата:
Про "негласные" правила наименования переменных и свойств я знаю.
оффициальные гайдлайны.
Цитата:
2. Ручное зануление ссылочных типов данных таки влияет на использование памяти. Можете сами посмотреть на поведение памяти процесса во время выполнения даже этого кода ... Если я зануляю все ссылки внутри массивов, и зануляю все массивы, и зануляю все ссылки - сборщик мусора освобождает память быстрее.
на этот счет надо понимать как работает сборщик мусора, если у вас переменная где-то висит(а особенно глобально), память не может быть собрана, ибо у объекта есть корни.
потому да, зануление может помогать, ибо вы отрезаете корни доступности.(убираете ссылки на объект)
но вообще это решает правильной областью видимости.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 10.02.2017 в 17:22.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.02.2017, 17:57   #18
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
но вообще это решает правильной областью видимости
И скоростью реагирования сборщика.
Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Отдали кучу времени и значительно усложнили код за экономию пары мб
Отдал кучу времени не для экономии памяти, а для того, что бы НЕ ПОВЕСИТЬ ПРОГРАММУ, и да - мне так интереснее.
Ради экономии пары мегабайт опять же - чисто принципиально, ибо код пишу для себя, за программу никто не платит, а значит самое время для собственных интересов, при которых приоритеты всегда разные. В данном случае - экономия памяти за счёт усложнения алгоритма и искусственного увеличения времени выполнения.
Увеличение времени выполнения - что бы программа не вешалась.
Приведу пример: лаунчер игры World Of Tanks ... Я не знаю, как он написан, но я вижу результат его работы - во время установки обновлений игры компьютер В ЦЕЛОМ тормозит, хотя процесс использует всего 5% нагрузки ЦП ... Какой дятел, и как он этого добился - я не знаю.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 10.02.2017, 18:04   #19
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Приведу пример: лаунчер игры World Of Tanks ... Я не знаю, как он написан, но я вижу результат его работы - во время установки обновлений игры компьютер В ЦЕЛОМ тормозит, хотя процесс использует всего 5% нагрузки ЦП ... Какой дятел, и как он этого добился - я не знаю.
Компьютер тормозит скорее всего из-за жесткого диска. Убрать такой эффект получится только если занизить скорость записи файлов. Сделают так - обновления будут ставиться часами, а вы скажете, что наколхозили, т.к. комп не тормозит, процессор простаивает, оперативки еще вагон, разработчики криворучки. Да и сложно это предусмотреть. У кого-то отдельная SSD под танчики, а кто-то на ноутбучном жестком диске 10-летнего возраста параллельно запустил десяток торрентов качать и обновлять танки. По поводу: компьютер в целом тормозит из-за программы - это больше к операционной системе и её разработчикам.
pu4koff вне форума Ответить с цитированием
Старый 10.02.2017, 18:09   #20
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Дык чтоб не вешался UI надо не саму работу замедлять, а только с выводом что-то делать.

Может и вообще не надо все выводить.
Цель-то кстати какая? Зачем нужен этот список всех файлов?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 10.02.2017 в 18:13.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
узнать есть ли в массиве одинаковые числа lanabanana Общие вопросы Delphi 12 23.02.2016 15:42
С какой стороны функция LORDIF Общие вопросы C/C++ 1 28.05.2012 22:38
ListView как узнать есть ли строки? Кольша Мультимедиа в Delphi 4 27.08.2011 14:17
Стороны света ≈ стороны монитора Alex Cones Свободное общение 21 26.08.2010 17:15