Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Outwork
4 / 4 / 0
Регистрация: 05.08.2014
Сообщений: 54
#1

Прошу консультации экспертов (ООП, многопоточность) - C#/.NET 4.x

16.11.2016, 13:02. Просмотров 2318. Ответов 45

Здравствуйте уважаемые форумчане! Давеча пытался устроиться на работу и прислали мне тестовое задание, далее привожу его текст:
Требуется написать консольную программу на C# для генерации сигнатуры указанного файла. Сигнатура генерируется следующим образом: исходный файл делится на блоки заданной длины (кроме последнего блока), для каждого блока вычисляется значение hash-функции SHA256, и вместе с его номером выводится в консоль.
Программа должна уметь обрабатывать файлы, размер которых превышает объем оперативной памяти, и при этом максимально эффективно использовать вычислительные мощности многопроцессорной системы. При работе с потоками допускается использовать только стандартные классы и библиотеки из .Net 3.5 (исключая ThreadPool, BackgroundWorker, TPL). Ожидается реализация с использованием Thread-ов. Путь до входного файла и размер блока задаются в командной строке. В случае возникновения ошибки во время выполнения программы ее текст и StackTrace необходимо вывести в консоль.
В общем посидел пару вечеров и наваял прогу на сколько позволяли знания и навыки. Поскольку ранее ничего подобного не делал, поначалу даже показалось, что задание несложное. Однако отправляя проект не оставляло ощущение, что сделал не так как надо.
Так в итоге и оказалось. Мне вежливо отказали дополнив комментариями касательно кода:
1. Вся программа в одном файле, двух классах и нескольких статических методах. ООП нет.
Классы не являются лишними, если у них есть понятная область отвественности.
В данном случае, если бы выделили класс для запуска потоков и отслеживания их завершения – то это не было бы лишним.

2.Алгоритм работы не эффективный. Файл сразу бьется на блоки и для каждого блока стартует новый поток. Все сразу. Никого thread pool нет.
Для подсчета хэша каждого блока запускается отдельный поток. Запуск потока трудоемкая операция, которая требует много ресурсов. Вариантов решения этой проблемы возможно несколько. Или реализовывать свою вариацию threadPool или использовать долгоживущие потоки.
Кроме того, сейчас никак не ограничивается число запущенных потоков. При их большом количестве, они будут бороться за процессорное время и значительная часть ресурсов будет тратиться на переключение контекстов между потоками.

3.Ожидание окончания всех потоков на Thread.Sleep
Ожидание завершения на Thread.Sleep является ресурсоемким. Поскольку основной поток, ждущий завершения, постоянно просыпается и занимает процессорное время, которое можно было потратить на обсчет следующего блока. Для решения этих проблем используют примитивы синхронизации.
Проверка окончания всех потоков происходит на статической перемерной threadCount. К ней осуществляется доступ из нескольких потоков, и доступ никак не синхронизирован.
Это стандартная проблема разделения ресурсов между и не исключена ситуация, что threadCount никогда не достигнет 0.
Собственно чтобы я хотел попросить: прокомментировать код, указать на проблемные места и предложить пример более удачной реализации. Хочу понять где слабые места и что надо подтянуть в плане знаний и навыков. Заранее всем благодарен!
0
Вложения
Тип файла: rar Program.rar (1.2 Кб, 39 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2016, 13:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос .NET 4.x Прошу консультации экспертов (ООП, многопоточность) (C#):

Прошу мнения экспертов - PHP
Всем здрасте! 'Недавно начал изучать PHP' короче бла-бла-бла=) Прислали мне тест сгенерировать html табличку.Сделать функцию которая...

Прошу совета экспертов о смене провайдера интернет - Сети
Здравствуйте. Сейчас тормозящий оптоволоконный ДжиПон 70 Мбит (реально до 30), хочу сменить на 2Ком или Билайн, что посоветуете? Читал...

Прошу консультации в выборе! - Выбор ноутбука
Добрый день уважаемые форумчане! Нужна ваша квалифицированная помощь в выборе ноутбука. Сразу опишу принцип будущего использования, время...

Прошу консультации по iptables - Ubuntu Linux
Доброго всем времени суток! Установлена у меня ubuntu 10.04. Поставлен apache2 в качестве веб сервера и ещё иное серверное ПО. Вот...

Прошу консультации по поводу запросов - WordPress
Доброго времени, подскажите пожалуйста следующий момент, допустим у меня есть страничка на которой хочу отображать данные из базы данных. В...

Прошу Вашей профессиональной консультации - Программирование Android
Всем здравствуйте уважаемые. Помогите разобраться в логах. Не могу "вкурить" что хочет от меня android studio. Добавил в свой проект код...

45
Usaga
Эксперт .NET
2725 / 2303 / 423
Регистрация: 21.01.2016
Сообщений: 9,054
Завершенные тесты: 2
17.11.2016, 07:28 #31
Цитата Сообщение от TopLayer Посмотреть сообщение
И ведь всё равно это снижает производительность.
Каким это боком оно снижает производительность? Метод Interlocked.Increment() - обёртка над процессорной командой cmpxchg. Ты можешь что-то быстрее изобрести?
0
TopLayer
714 / 537 / 206
Регистрация: 23.10.2016
Сообщений: 1,273
Завершенные тесты: 7
17.11.2016, 07:48 #32
Usaga, я не могу изобрести более быстрый атомарный инкремент. Я лишь удивлён тем, что этот атомарный инкремент используется повсеместно на х86. Ведь это снижает производительность (я не спец, может я и неправ).

http://faydoc.tripod.com/cpu/cmpxchg.htm
This instruction can be used with a LOCK prefix to allow the instruction to be executed atomi-cally. To simplify the interface to the processor's bus, the destination operand receives a write cycle without regard to the result of the comparison.
http://www.agner.org/optimize/instruction_tables.pdf
Instructions with a LOCK prefix have a long latency that depends on cache organization and possibly RAM speed. If there are multiple processors or cores or direct memory access (DMA) devices then all locked instructions will lock a cache line for exclusive access, which may involve RAM access. A LOCK prefix typically costs more than a hundred clock cycles, even on single-processor systems. This also applies to the XCHG instruction with a memory operand.
1
freeba
Неадекват
1194 / 991 / 111
Регистрация: 02.04.2010
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 2
17.11.2016, 13:13 #33
Цитата Сообщение от TopLayer Посмотреть сообщение
Я лишь удивлён тем, что этот атомарный инкремент используется повсеместно на х86. Ведь это снижает производительность (я не спец, может я и неправ).
На всех процессорах поддерживающих windows существует аппаратный примитив CAS (Compare and Swap), собственно он и скрывается за перегрузками Interlocked, так что на производительность это не сильно влияет. Интереснее почему от его принудительного использования отказались в x64 - возможно в угоду кроссплатформенности, а может просто по желанию левой пятки.
1
Outwork
4 / 4 / 0
Регистрация: 05.08.2014
Сообщений: 54
17.11.2016, 23:40  [ТС] #34
Спасибо, что откликнулись! Из всего прочитанного сделал вывод, что однозначно лучшего подхода нет, надо исходить из поставленной задачи и подбирать вариант реализации. Думаю надо параллельно (!) изучать теорию и опробовать на практике с замером производительности.
Кстати, есть ли вариант многопоточной загрузки файла в ОЗУ. Для примера, есть метод считывающий данные из файла Excel (или базу SQLite) и формирующий на его основе DataTable, как реализовать в данном случае?
0
Вложения
Тип файла: rar Database.rar (1.6 Кб, 0 просмотров)
AlexPtr
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 4
20.11.2016, 22:02 #35
Здравствуйте!
Начал изучать многопоточность (по Рихтеру), выполняю упражнения и заодно смотрю коды опытных программеров.
Запустил Ваш код, и обратил внимание, что блоки выводятся на консоль непоследовательно.
Это нормально для потоков или допущена ошибка?
З.Ы. еще не совсем понял, почему Вы создаете отдельный класс FileStreamer, какой у него смысл?
0
Миниатюры
Прошу консультации экспертов (ООП, многопоточность)  
AlexPtr
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 4
20.11.2016, 22:05 #36
Здравствуйте!
Недавно начал изучать потоки (по Рихтеру) и заодно просматриваю коды опытных программеров.
При запуске Вашего кода обнаружил, что некоторые блоки выводятся непоследовательно (см. скриншот)
Это нормально для потоков или допущена какая-то ошибка?
0
Outwork
4 / 4 / 0
Регистрация: 05.08.2014
Сообщений: 54
20.11.2016, 22:30  [ТС] #37
AlexPtr, здравствуйте, блоки могут обрабатываться непоследовательно поскольку каждый поток работает со своим блоком файла и позже запущенный может закончить раньше чем его предшественник.
1
AlexPtr
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 4
20.11.2016, 22:40 #38
Спасибо. Понял. Пожалуй, потоки одна из самых сложных (но интересных) тем в курсе C#.
Еще такой вопрос - можете посоветовать хорошую литературу на тему многопоточности? В книге Рихтера все подробно рассмотрено, но примеров маловато.
0
Exerion
[Bicycle Reinventor]
276 / 214 / 53
Регистрация: 19.10.2011
Сообщений: 589
Записей в блоге: 2
Завершенные тесты: 2
21.11.2016, 08:55 #39
Joseph Albahari о многопоточности в C# в пяти частях: тык.
На RSDN есть переводы некоторых частей: первая, вторая. Остальные, скорее всего, придётся искать в кеше гугла, потому что их выпилили. Помнится у кого-то из старичков форума были сохранены эти переводы.
0
freeba
Неадекват
1194 / 991 / 111
Регистрация: 02.04.2010
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 2
21.11.2016, 09:59 #40
Цитата Сообщение от AlexPtr Посмотреть сообщение
З.Ы. еще не совсем понял, почему Вы создаете отдельный класс FileStreamer, какой у него смысл?
Смысл в том, что дисковая подсистема не любит когда файлы читаются в несколько потоков. В моем примере используются т.н. "тяжелые" потоки - их просто нужно запустить, а далее они сами разберутся, что нужно сделать - для взаимодействия с файловой системой им и нужен FileStreamer, который обеспечивает последовательное, поблочное чтение.

PS: Данное решение с точки зрения ООП является не очень правильным - пример уважаемого Exerion более точно соответствует парадигме, хотя и является чуть более медленным. Для обучения лучше использовать именно его.
0
insite2012
Модератор
Эксперт .NET
4652 / 3604 / 878
Регистрация: 12.10.2013
Сообщений: 10,659
Записей в блоге: 2
21.11.2016, 11:11 #41
Цитата Сообщение от Exerion Посмотреть сообщение
у кого-то из старичков форума были сохранены эти переводы.
Вот все три.
0
Вложения
Тип файла: pdf C#_Part_1.pdf (830.5 Кб, 16 просмотров)
Тип файла: pdf C#_Part_2.pdf (930.5 Кб, 13 просмотров)
Тип файла: pdf C#_Part_3.pdf (966.5 Кб, 15 просмотров)
AlexPtr
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 4
21.11.2016, 14:35 #42
Спасибо, никогда не слышал о таком. Насчет переводов - ничего страшного, на английском почитаю.

Добавлено через 3 минуты
Знаю о том, что диск - однопоточное устройство в отличие от процессора. Вопрос был именно с точки зрения ООП.
Несмотря на некоторые отклонения от ООП, Ваш код все равно очень интересен с точки зрения многопоточности - узнал много нового.
0
movorpovor
1 / 1 / 0
Регистрация: 24.05.2015
Сообщений: 45
27.01.2017, 15:13 #43
Цитата Сообщение от freeba Посмотреть сообщение
Смысл в том, что дисковая подсистема не любит когда файлы читаются в несколько потоков. В моем примере используются т.н. "тяжелые" потоки - их просто нужно запустить, а далее они сами разберутся, что нужно сделать - для взаимодействия с файловой системой им и нужен FileStreamer, который обеспечивает последовательное, поблочное чтение.

PS: Данное решение с точки зрения ООП является не очень правильным - пример уважаемого Exerion более точно соответствует парадигме, хотя и является чуть более медленным. Для обучения лучше использовать именно его.
в чем заключается более точное соответствие кода Exerion парадигме ооп?

и если не секрет, зачем в вашем коде класс ThreadParameter? почему не структура или там словарик, а именно класс?
0
freeba
Неадекват
1194 / 991 / 111
Регистрация: 02.04.2010
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 2
27.01.2017, 16:47 #44
Цитата Сообщение от movorpovor Посмотреть сообщение
и если не секрет, зачем в вашем коде класс ThreadParameter? почему не структура или там словарик, а именно класс?
Если это была структура, то она создавалась в FileStreamer и потом копировалась в поток обработки целиком, а т.к. используется класс в поток передается лишь ссылка на него.

Цитата Сообщение от movorpovor Посмотреть сообщение
в чем заключается более точное соответствие кода Exerion парадигме ооп?
Если подходить формально, код не использующий наследование не является соответствующим ООП парадигме. И сам код более аккуратный и компактный - для обучения он лучше подойдет.
0
movorpovor
1 / 1 / 0
Регистрация: 24.05.2015
Сообщений: 45
27.01.2017, 19:20 #45
спасибо! уж не знаю кому как, а ваш код мне куда более понятнее, чем код Exerion

Добавлено через 2 часа 31 минуту
freeba а такой еще вопрос: что у вас, что у Exerion try/catch блок и трейс ошибки идут только в основном потоке. Я могу ошибаться, но вроде как и Рихтер и Альбахари утверждают, что если исключение вылетит в одном из дочерних потоков, то в главный поток она не попадет. Разве не нужно try/catch блок вынести в каждый поток отдельно?
0
27.01.2017, 19:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2017, 19:20
Привет! Вот еще темы с ответами:

Тестирование компонентов по даташиту. Прошу консультации - Электроника
Рассмотрим предлагаемые тесты в даташите на мосфет FR9024N (в качестве примера).

Прошу консультации с HP Pavilion dv6 3057er - Ремонт ноутбуков
Всем привет! Прошу консультации. Ноутбук HP Pavilion dv6 3057er. Windows 7 Домашняя базовая лицензия. Начались сильные подвисания....

Выбор библиотеки для работы с *.pdf прошу консультации - Java
Всем добрый день. Возникла потребность редактирования pdf джавой. Погуглив, увидел что библиотек для этих целей достаточно много в...

Помощь экспертов - C++
как можно автоматически создавать названия функции т.е. как можно сгенерировать название функции. Пример. имеется такая задача: что в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru