Си диез / Говнокод #22449 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
private void ScanDir()
{
	CurrentLevel++;
	string save_dir=CurrentDir;
	int i=0;
	if (current_dirs.Length>0)
		for (;i<current_dirs.Length;i++)
		{
			out_data+=current_tabs+"<DIR> "+CutPathName(current_dirs[i])+"\r\n";
			try { CurrentDir=current_dirs[i]; }
			catch
			{
				out_data+=current_tabs+"<ошибка доступа>\r\n\r\n";
				CurrentDir=save_dir;
				continue;
			}
			waiting=true; // синхронизатор этого потока
			Thread.Sleep(120); // задержка, что бы второй поток успел скинуть данные
			while (saving) // ожидание флага из потока записи
				Thread.Sleep(100);
			waiting=false;
			ScanDir();
			CurrentDir=save_dir;
		}
	else
		out_data+=current_tabs+"<папки отсутствуют>\r\n";
	save_dir=null;
	string[] inner_files;
	try { inner_files=Directory.GetFiles(save_dir); }
	catch { out_data+=current_tabs+"<ошибка доступа>\r\n\r\n"; return; }
	if (inner_files.Length>0)
		for (i=0;i<inner_files.Length;i++)
		{
			out_data+=current_tabs+CutPathName(inner_files[i])+"\r\n";
			inner_files[i]=null;
		}
	else
		out_data+=current_tabs+"<файлы отсутствуют>\r\n";
	inner_files=null;
	CurrentLevel--;
}

Загрузка списка файлов и директорий на диске.
Оптимизировано для уменьшения потребления памяти и нагрузки CPU.

От одного только описания оптимизации хочется убежать и спрятаться под одеяло:

"Для оптимизации я добавил в глобалку следующую инфу:
1) массив текущих папок;
2) текущий уровень вложения;
3) текущую папку для глобалки;
4) строка табуляции;
5) свойства для п. 2 и 3.

2 для того, что бы в его свойстве (5) менять табулятор (4) по необходимости;
3 добавлено исключительно для свойства (5), в котором подгуржаются текущие папки (1)."

Запостил: FrontlineReporter FrontlineReporter, (Updated )

Комментарии (162) RSS

  • @Thread.Sleep(120);

    Дальше и смотреть не стал. Въебал плюсъ.
    Ответить
      • судя по уебищному неймингу пациент с скриптового языка сбежал. Я прав?

        Ох, тут два типа нейминга...
        Ответить
          • Стреляй ему в жопу, голова явно пуста

            А сурьезно - тайком поставь стайлкоп и не давай компилить неотрефакторенный код
            Ответить
            • К счастью он еще не работает, человечество пока в безопасности. Пока только заканчивает вуз и делится своими творениями на форумах.
              Когда ему сказали про стиль кода - не проникся и ответил, что ему и так норм.
              Ответить
                • Да нихуя. Он увидит как другие пишут, и будет также код форматировать
                  Ответить
    • Вот почему нельзя было придумать эскейп для Environment.NewLine?
      Это же пиздец, такую длинную хуйню каждый раз писать, да еще и клеить строки придется
      Ответить
      • >>такую длинную хуйню каждый раз писать

        env[enter].nl[enter]?
        Ответить
        • 1. нужен решарпер
          2. проблема километровой длины не решена
          3. проблема конкатенации не решена
          Ответить
          • 1. а что, кто-то нынче на шарпах без решарпера пишет?
            2. Проблема имени Тараса. Надуманная имхо
            3. Ну ок, будем хардкодить /r/n во все строки, главное ведь избавиться от ненавистной конкатенации.
            Ответить
            • \r\n гарантированно переведет строку на любой платформе. Проблемы не вижу
              Ответить
              • перевод строки? часто файлы на консоль выводишь?

                у мусо-досников больше проблем с тем что часто у последней строки нет \n. потому что многие виндозники интерпретируют текстовый файл как список строк с \n разделителем. но не все. почему и грабли. в одном редакторе в файле Н строк - в другом Н+1. одна тулза съела файл - друга споткнулась.

                по крайней мене на юнихах определение сидит в позикс и разброда и шатания нету: текстовый файл это список строк, каждая из которых заканчивается \n.

                а на виндах... я месяц назад из некро-тулчейна ворнинги видел, типа: "у последей строки нет терминатора! я это умею обрабатывать, но дайте я вам в логи все равно посру!!" как если бы назад 20 лет в прошлое вернулся...
                Ответить
                • Многие мусодосные/виндозные проги одиночный \n вообще за перевод строки не считают. За перевод строки они считают именно комбинацию \r\n (именно так, а не наоборот).

                  А что касается финального \r\n, то всё так: одни проги считают \r\n окончанием строки, другие — разделителем строк. Это примерно как финальная запятая в инициализации массива, которая в одних ЯП создаёт лишний пустой элемент, в других ЯП игнорируется.

                  gcc из mingw действительно до сих пор срёт ворнингом, если у последней строки нет терминатора, но... всё нормально компилирует и без него.
                  Ответить
                  • на гцц не видел - а вот какие-то тулзы из vs2008 радостно кричали.

                    с последним \n, на прошлых проектах это была медленная неспешная cold war. придут юниксоиды - в файлы последний \n вставят. след релиз делают жабщики - и ихняя эклипсня на последний \n "жалуется" как на пустую строку - удаляют. самое смешное было что в паре файлов в конце стоял умилительный коммент: "последнюю пустую строку не удалять!!"

                    это все всплыло когда в геррит в авто-ревьювер вставили эти проверки для текстовых файлов. жабщики сразу вонь подняли: гиги бойлер-плейта в ихнем свинге - это у них всегда пожалуйста, а вот "лишние" концы сторок в паре текстовых файлов... - "но пассаран"!
                    Ответить
              • Многие *никсовые проги считают \r обычным символом, входящим в строку, и ругаются на ошибку в синтаксисе, если это какой-то скрипт.
                Ответить
            • Надо просто в printf (ну т.е. string.Format) добавить модификатор, который раскрывается в Environment.NewLine, какой-нибудь "%L". Мне даже кажется, я где-то что-то похожее видел, но не помню, где.
              Ответить
              • Все же лучше сделать эскейп для таких переводов, чтобы можно было везде использовать
                Например, \cykablyad
                Ответить
              • я уже пару раз (буквально: два раза) делал обертки для ostream/streambuf в С++ которая конвертила "\n" (и начало строки) в то что было нужно. уверен что даже в вашем шарпе подобное делается.

                я к тому что плодить костылей не надо - оно уже давно в большинстве систем спокойно стандартный "\n" работает.

                даже на виндах - как долго штатный нотепад не используешь (и им уже давно никто не пользуется) ниразу не заметишь что у тебя файл с юникс концами строк.
                Ответить
                • В текстовых редакторах \n работает. Во многих ЯП работает. А вот bat-файл и прочая виндопитушня требует \r\n, иначе считает, что это однострочник, и обламывается.
                  Ответить
                  • я уверен что VB/VBA тоже обломится. но этим говном нормальные люди все равно не пользются. а те у кого уже некрософто-опухоль-мозга появилась - они живут в своем мрачном мирке и ничего другого и не знают.
                    Ответить
                    • Тут вот что интересно:
                      1. Компиляторам божественной сишечки наплевать на представление концов строк: хоть \n, хоть \r\n работает в любой операционной системе. И многие другие компиляторы терпимо относятся к нестандартным разделителям.

                      2. Скриптовые языки (bash в никсах, bat в мусодосах/виндовозах) требуют определённого разделителя: в никсах только \n (если где-то встретится \r\n, то интерпретатор ругается на незнакомый ему символ \r), в виндовозах только \r\n (если где-то встретится одиночный \n, то он за разделитель строки посчитан не будет).

                      Заметим, что по отношению к операционным системам всё симметрично, но по отношению к ЯП неоднообразно.

                      Это ещё хорошо, что классическая Макось (которая без буквы Х в названии) ушла в анналы истории, потому что в ней разделителем строк был \r.
                      Ответить
                      • >И многие другие компиляторы нетерпимо относятся к стандартным разделителям.
                        Потому что языки в жопе.
                        Ответить
                      • Забавно, ведь \r в баше должен бы вернуть курсор в начало строки.
                        Ответить
                      • > Это ещё хорошо, что классическая Макось (которая без буквы Х в названии) ушла в анналы истории, потому что в ней разделителем строк был \r.

                        последний раз когда трогал - NeXT гуи (Cocoa) во времена 10.3-10.5 - все также послушно использовали разделитель \r.

                        а когда начинается BSD - то там \n.

                        но даже и гуи файло/этц с \n читает правильно.

                        > в никсах только \n (если где-то встретится \r\n, то интерпретатор ругается на незнакомый ему символ \r)

                        да, это я как то и подзабыл. isblank('\r') != true; почему шелл и попытается \r как команду выполнить, потому что \r валидный символ имени файла.
                        Ответить
                        • кокоа это не только gui, это практически stdlib для обжси

                          Foundation это тоже часть кокоа, и кто скажет что NSObject или NSString это GUI тот пусть бросит в меня яблоко.
                          Ответить
                          • в старые времена это было CoreFoundation (== stdlib for ObjC) и поверху него Cocoa (CF* классы vs NS* классы (NS == NeXT Step)). CoreFoundation она гуи-лессе в духе, но ОС сама по себе гуи-сентрик поэтому (как и на виндах) различия делать смысла мало.
                            Ответить
  • > waiting=true; // синхронизатор этого потока
    >Thread.Sleep(120); // задержка, что бы второй поток успел скинуть данные
    > while (saving) // ожидание флага из потока записи
    > Thread.Sleep(100);
    > waiting=false;

    Лул, прямо-таки последнее слово синхронизации потоков, Brian Goetz лопнул от зависти, наблюдая такой анскилл многопоточного программирования.
    Ответить
    • пацан просто на коленке монитор изобрел. а ты ему завидуешь!
      Ответить
          • @пацан просто монитор изобрел
            @@на коленке
            Увидел блики экрана в растекающейся жидкости? Тоже мне - открытие...
            Роман Кащицын пытался намекать.
            Ответить
    • -120
      +N = AskUser("Примерно оцените мощность вашего компьютера по шкале от 0 до 1")
      +120*N
      Ответить
  • улучшил использование CPU для работы в быкграунде. маштабируется линейно по количеству процессоров и каталогов, и гарантировано 0% CPU нагрузки.
    private void ScanDir()
    {
        Thread.Sleep(INFINITY);
    }

    в добавок, прозрачная авто-коррекция всех возможных ошибок!

    бонус: очень экономичный расход памяти!!!
    Ответить
    • Чтобы сделать из диска random access memory, достаточно после чтения каждого байта делать слип в 1 секунду.
      Ответить
      • Нет, нужно спать произвольное число секунд. Random же.
        Ответить
        • он рендом не потому
          он рендом потому что можно не последовательно читать

          и что, без слипа с диска нельзя читать не последовательно?
          Ответить
      • С диска нельзя прочитать байт. Минимальная единица, которую можно прочитать, это сектор.

        Тем не менее, на высоком уровне создаётся ощущение, что "прочитать байт" можно: ОС читает сектор и складывает его в кэш, из которого потом можно достать следующие байты.

        В общем, необходимая задержка зависит от устройства кэша.
        Ответить
        • из DRAM тоже нельзя прочитать байт: читать можно только шириной чипа (который может быть меньше байта, лол!). Но благодаря кешу мы про это ничего не знаем.

          Просто у диска пенальти больше. Потому все ФС старались выравнивать по границе блока (который был 512 байт до недавнего времени везде)
          Ответить
            • Ну почему не инкаус, например?

              Он тоже любит попиздеть про всякую низкоуровневую хуиту.
              Остальные тут или математики (как Рома) или джаваскриптеры, простихосподи
              Ответить
              • > математики (как Рома)

                Я вообще ни разу не математик, просто математику люблю.
                Ответить
              • > или математики
                В интервью на ютубчике, емнип, Роман говорил, что математика программисту не нужна.
                Ответить
                • > говорил, что математика программисту не нужна

                  Пошёл на ютубчик, пересмотрел. Вы всё врёти. Я сказал, что многие известные программисты шмогли без математики. Кому-то она нужна, кому-то не особо. Мне например, в последнее время, всё больше и больше нужна статистика и тервер.
                  Ответить
                    • > зачем

                      Контроль качества данных. Есть массив данных (~10^9), надо оценить, насколько хороши или плохи различные его срезы. Многие вещи можно проверить только глазами людей, и хочется максимально эффективно использовать человеческий труд, результаты которого, в частности, потом используются для обучения машин.

                      На одном из предыдущих мест работы мне бы тоже статистика не помешала, но я тогда ещё об этом не знал.
                      Ответить
              • Про низкоуровневую хуиту любит писать Dummy-с-цифрами, ещё чувак с сумматором на аве иногда про железо пишет.
                Ответить
                • MSIL всмысле?

                  Кегги у нас вроде самый активный дотнетчик.
                  Ответить
                      • Тут так принято?

                        Постоянно новеньких как но называть?

                        А почему я не Борланд?
                        Ответить
                        • Когда Кегданы вырастают, они становятся взрослыми бородатыми Бормандами
                          Ответить
                          • нет
                            кегги и борманд разные

                            вот ты вырастишь в борманда, это точно
                            Ответить
                                  • <a href= http://data-recovery-software.bid/ >recover data from external hard drive</a> prednisone with no rx
                                    Ответить
                                      • Потому роман и говорил что математика не нужна.
                                        Ответить
                                        • > Потому роман и говорил что математика не нужна.


                                          Ты действительно считаешь, что я имел в виду SPJ? Лол, уж он-то знает математику получше нас всех. Я читал многие его статьи (особенно мне доставила статья про алгебру финансовых контрактов, на этих результатах целая индустрия сейчас построена) и смотрел записи его докладов. Умеет, могёт.

                                          Ну и он дело говорит: он не любит держать в памяти всякую ерунду и предпочитает просто использовать мозг, чтобы находить/выводить результаты. Зачем запоминать результаты, которые тривиально выводятся из общих принципов.
                                          Ответить
                                          • Ты действительно не умеешь в иронию?

                                            Ты правда думаешь что я не знаю кто такой SPJ, и считаю что чувак который пилит реализацию хаскеля не может в математику?
                                            Ответить
                                            • Чувак, который пилит реализацию хаскеля, должен хорошо знать свою работу. Он должен уметь хорошо класть керпич на кирпичь. Он должен знать устройство линий кэша, работу конвейера и предиктора команд, чтобы получить пирфоманс. А про математику кукарекают те, кто за свою жизнь не написали ни одной программы.
                                              Ответить
                                                • Это не я. Я люблю JS, т.к. это настоящий ЯВУ, где работают абстракции и рутинная низкоуровневая питушня вроде кэшей и конвейеров полностью выпилена.
                                                  Ответить
                                                    • Ну это скорее баг, чем фича. Как все эти унылые 32/64 бита и неточные float/double.
                                                      Ответить
                                                  • И да, в JS можно сделать большой typed array и начать его долбить(читать/писать в него), замеряя время задержки. Таким образом можно определить кэши проца
                                                    Ответить
                                            • > Ты правда думаешь что я не знаю кто такой SPJ

                                              Откуда мне знать? Я уверен, что примерно половина моих коллег на работе (а то и больше) о нём не слышали. Сам понимаешь, шансы у рандомного багора на ГК и того меньше.
                                              Ответить
                                            • noname 12 часов назад
                                              > Ты действительно не умеешь в иронию?
                                              > Ты правда думаешь что я не знаю кто такой JSP, и считаю что ...
                                              Чтобы понимали иронию и оценивали уровень знаний, нужно писать с личной учётной записи.
                                              Ответить
                                          • > Зачем запоминать результаты, которые тривиально выводятся из общих принципов.

                                            Мемоизация потому что. Не будешь же ты каждый раз в уме считать 7*8, намного проще это запомнить
                                            Ответить
                                            • > Не будешь же ты каждый раз в уме считать 7*8

                                              Даже когда есть "запомненный" результат, неплохо бы уметь его быстро воспроизвести, чтобы проверить.
                                              Я помню, что 7*8 это 56, но обычно всё равно проверяю себя примерно так:
                                              7*8 == 7 * (10 - 2) = 70 - 7+7 = 56

                                              Таблица умножения полезна, но знание простых хаков для быстрого умножения, кмк, полезней — область применения шире.

                                              > намного проще это запомнить

                                              Ну мне, например, настолько редко нужно считать производную отношения двух функций, что мне проще её вывести, когда нужно, хотя и выучить её, казалось бы, просто.
                                              Ответить
                                              • > что мне проще её вывести
                                                Помнится, я даже на егэ выводил с нуля всю хрень в духе sin(a+b) = ... т.к. запоминать её было влом.
                                                Ответить
                                                • > всю хрень в духе sin(a+b) = ...

                                                  Я вообще всю эту тригонометрическую ересь забыл почти сразу, как узнал о разложении тригонометрических функций в комплексные экспоненты.
                                                  Ответить
                                                • > егэ
                                                  Наконец появились пруфы, что борманда взломал сукаблядь. Все знают, что настоящему было >30.
                                                  Ответить
                                      • охуенно чувак пишет

                                        Хаскель он написать осилил, а LINQ изучить нет
                                        Ответить
                                    • > арголитм
                                      Звучит внушительно. "Арго" (тайный язык) и "литм" (от гр. λίθος, камень?) Т.е. окаменевший мемчик?
                                      Ответить
                                      • Я помню, как доставал заначку из закрытого шкафа. Отодвинул шкаф от стенки, отодрал оргалит, и за оргалитом нашёл бутылку.
                                        Ответить
                                    • о, точно, у меня же на гитхабе есть страница.

                                      Нахуя она мне?
                                      Ответить
        • Как секундный слип после чтения каждого байта зависит от устройства кэша? Это в сотни раз больше, чем любой сик по диску, так что на фоне такого слипа похуй откуда байт: из пейджкэша, с соседнего сектора, или с другого края блина.
          Ответить

Добавить комментарий

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8