Что нового

Переделать часть кода с С++ на autoit

Prog

Продвинутый
Сообщения
484
Репутация
57
Отговорить меня писать на autoit
Никто не отговаривает. Но должны знать что скорость выполнения скрипта может быть слабым звеном в цепочке измерения скорости диска. AutoIt интерпретируемый и не сравнится по скорости с компилируемыми ЯП. Выполнение медленнее на несколько порядков.

На самом деле в теме нет ограничений о версии диска. Это и шпиндельные и ssd диски.
У HDD время доступа около 20 мс и уменьшить его не просто.

Это и от буфера зависит (физический или slc)и даже от температуры, не говоря уже о контроллере.
Аидой тестируйте весь объем. Тогда будет видно как ведет себя диск при заполнении SLC кеша.

А вот кристал диск инфо выше 32Мб у шпиндельных их не видит А у моего буфер на 512мб.
У HDD? Черепичный?

А у ссд дисков кристал диск инфо вообще не видит буфер.
Эту информацию диск не сообщает. Ее можно получить только спец. софтом. Утилитами Вадима Очкина и аналогичными.

нужна программа, которая с помощью DeviceIOCOntrol вытянет всю инфу по любому диску и даже тип памяти, и довесок к ней, который тестирует скорость в различных режимах
Напишите ее. Иначе в чем смыл этой темы?
У вас есть коллекция дисков - есть на чем тестировать.

Ну и могу пример того, что тип памяти определяется привести
Свяжитесь с Вадимом Очкиным (ник vlo) и узнайте как он определяет контролер и память в своих утилитах.

Ну и могу пример того, что тип памяти определяется привести
Это результат работы утилиты Вадима Очкина. Из него совершенно непонятно как определяется тип памяти.
 

AZJIO

Меценат
Меценат
Сообщения
2,814
Репутация
1,170
В теме речь об SSD
как этот тезис заставляет думать что требуется многопоточность? То есть аргумент "мы тут не о шпидельном"? Моё восприятие что ранее система работала таким образом и я не вижу подтверждения, что это изменилось. Попробуй загуглить вопрос "многопоточная запись на SSD диск". Я не нахожу подтверждение этому. Формат данных по кабелю жёсткого диска как я понимаю один и тот же, что на шпидельный диск, что на SSD, а контроллер пускай другой, каждый пишет свои данные по разному. Из этого утверждения нет необходимости многопоточности.

Чем эффективнее работает контроллер
да куда уж эффективней писать на диск с максимальной скоростью. Память ОЗУ быстрее и её "шлейф" быстрее чем шлейф жёсткого диска. По любому запись будет тормозить либо по контроллеру, который передаёт данные на шлейф жёсткого диска, либо сам шлейф, либо контроллер диска. Ведь известно что быстрее памяти ОЗУ может только кеш процессора.

хотя бы пару человек заинтересовала
только ради спора, надо признать никто за вас не напишет, я даже не читал про DeviceIOControl, я вот перевёл частично SpiderBasic (для андроида) параллельно общаясь тут, игрушку пишу, то есть пишу то что мне по душе и не прочь сам развести кого нибудь на свою тему, хотя понимаю что это невозможно, разве что выложив свои наработки, иногда без ожидания что кто-то вообще ответит или хотя бы посмотрит. Так что сам не начнёшь, другой не начнёт или начнёт только если ему это будет нужно, а проги вещь индивидуальная, легло на душу что-то и делаешь.

AutoIt интерпретируемый и не сравнится по скорости с компилируемыми ЯП
Важно знать одно исключение - функции написаны на языке С++, поэтому если команда/строка/цикл требует интерпретации, то да, она может быть узким местом, но если вызвать команду записи на диск данных из памяти, то это будет выполнятся API функциями на скорости на которою способна Windows, а AutoIt3 просто будет ждать пока закончится операция чтобы получить флаг "успешно". И так с многими функциями, например регулярные выражения тоже будут работать со скоростью компилируемого языка, так как функционал движка внутри AutoIt3 скомпилирован и однократная операция для обработки большого файла выполнится с одинаковым временем.

Там можно определить и контроллер, и буфер
А буфер у SSD имеет значение? Если весь диск память, то в теории можно просто выделить минимальный буфер если диск заполнен, а если есть свободное пространство то использовать его в качестве буфера, например 10% от свободного пространства.
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
484
Репутация
57
как этот тезис заставляет думать что требуется многопоточность?
Винда многозадачная и в один и тот же момент несколько приложений могут что-то читать или записывать на диск.
Чтобы воспроизвести эту ситуация в одном приложении (процессе) необходима многопоточность или асинхронный (неблокирующий) ввод/вывод на диск.

Попробуй загуглить вопрос "многопоточная запись на SSD диск".
Нужно искать "SSD глубина очереди запросов". https://vk.com/@bezwindowsa-kak-proverit-skorost-ssd

Формат данных по кабелю жёсткого диска как я понимаю один и тот же, что на шпидельный диск, что на SSD, а контроллер пускай другой, каждый пишет свои данные по разному. Из этого утверждения нет необходимости многопоточности.
Да пожалуйста, используйте в одном потоке асинхронный ввод/вывод чтобы получить нужную глубину очереди запросов.

да куда уж эффективней писать на диск с максимальной скоростью.
Этот тест называется скорость линейного чтения/записи. Но необходим также тест чтения/записи мелких блоков данных от множества приложений (винда многозадачная). Потому что именно такой вид записи чаще всего встречается в системе (винда что-то пишет в фоне, браузеры читают/пишут в кэш/из кэеша).

По любому запись будет тормозить либо по контроллеру, который передаёт данные на шлейф жёсткого диска, либо сам шлейф, либо контроллер диска.
Тест нужен чтобы проверить насколько быстро контроллер может отдавать данные при множестве запросов от нескольких приложений.

я даже не читал про DeviceIOControl
Это WinAPI отправляющая запросы драйверу http://www.vsokovikov.narod.ru/New_MSDN_API/Device_io/fn_deviceiocontrol.htm

Если весь диск память, то в теории можно просто выделить минимальный буфер если диск заполнен
Такая возможность не предусмотрена производителями дисков. Запись во flash уменьшает ресурс диска.
Речь про ОЗУ буфер в котором не только хранятся данные перед записью во flash, но и расположена таблица трансляции блоков. Без ОЗУ производительность ниже (при заполнении SLC кэша, скорость может снизится до 10 МБ/с при линейной записи), а расход ресурса выше.
 
Автор
D

DyadyaGenya

Знающий
Сообщения
299
Репутация
9
У HDD? Черепичный?
В смысле?
Свяжитесь с Вадимом Очкиным (ник vlo) и узнайте как он определяет контролер и память в своих утилитах
Года два назад связывался. Он не захотел общаться на эту тему. А потом мне уже было не до того.
Напишите ее. Иначе в чем смыл этой темы?
У вас есть коллекция дисков - есть на чем тестировать
Я и пробую. Только ж пояснял. Года два за тему не брался. Многое забыл. И сейчас особо времени нет. Если начать опять с нуля, то опять не успею и потрачу время зря. Потому и попросил помощь в переводе доступных примеров и команд на язык autoit.
Эту информацию диск не сообщает. Ее можно получить только спец. софтом. Утилитами Вадима Очкина и аналогичными.
А какие ещё аналогичные есть? И почему вы так решили, что диск не сообщает обычными средствами? Вот тут что-то пишут про определение буфера, если я правильно прочитал:
Аидой тестируйте весь объем. Тогда будет видно как ведет себя диск при заполнении SLC кеша.
Зачем аидой? Достаточно обычного копирования. При детальном отображении сразу будет, когда заканчивается буфер, начинается провал в скорости. Потому я со скринами и заморачивался, когда делал интерфейс для копирования файлов.
У HDD время доступа около 20 мс и уменьшить его не просто.
Что-то я уже потерялся, к чему это. Я и мел ввиду, что хотелось бы прогу, которая работает как со шпиндельными, так и с ссд дисками
Сообщение автоматически объединено:

только ради спора, надо признать никто за вас не напишет
А я и не прошу написать за меня. Мне бы показать на примере некоторые моменты на понятном мне языке. Тогда, теоретически, глядя как это сделано в Си, можно будет понять как дальше написать на autoit без особого изучения Си
но если вызвать команду записи на диск данных из памяти, то это будет выполнятся API функциями на скорости на которою способна Windows, а AutoIt3 просто будет ждать пока закончится операция чтобы получить флаг "успешно". И так с многими функциями
Потому и считаю, что на autoit можно написать подобное. Стартуй виндовую команду, фиксируй начало и конец. Не говоря уже о получении инфы о самом диске.
А буфер у SSD имеет значение? Если весь диск память, то в теории можно просто выделить минимальный буфер если диск заполнен, а если есть свободное пространство то использовать его в качестве буфера, например 10% от свободного пространства.
Попробуйте скопируйте и увидите проседание скорости.
Сообщение автоматически объединено:

Этот тест называется скорость линейного чтения/записи. Но необходим также тест чтения/записи мелких блоков данных от множества приложений (винда многозадачная). Потому что именно такой вид записи чаще всего встречается в системе (винда что-то пишет в фоне, браузеры читают/пишут в кэш/из кэеша).
Совершенно согласен
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
484
Репутация
57
А кэш у дисков с SMR довольно внушительный: типичный размер — 256 Мб и больше. Кстати говоря, именно большой размер кэша HDD является одним из косвенных признаков того, что перед вами диск с «черепичной» записью.

Начните с простого. Создайте буфер в памяти, заполните его и запишите на диск измеряя скорость записи.

Мне бы показать на примере некоторые моменты на понятном мне языке. Тогда, теоретически, глядя как это сделано в Си, можно будет понять как дальше написать на autoit без особого изучения Си
Мы же не знаем какие моменты вам непонятны.
Выкладывайте куски кода с которыми возникли сложности и может кто-то переведет их на AutoIt.
 
Автор
D

DyadyaGenya

Знающий
Сообщения
299
Репутация
9
Начните с простого. Создайте буфер в памяти, заполните его и запишите на диск измеряя скорость записи.
Пару лет назад я делал нечто подобное и тут на форуме была моя тема по этому поводу.
Мы же не знаем какие моменты вам непонятны.
Выкладывайте куски кода с которыми возникли сложности и может кто-то переведет их на AutoIt
Я и написал что мне не понятно, привел если не кристал диск, то хотя бы справку майкрософта по работе с дисками с помощью DiveceIOControl и даже на работу с NVME с помощью DeviceIOControl. Там по ссылкам куча функций
Например, как с их помощью прочитать смарт? Хоть на примере кода кристал диск инфо, хоть на справке майкрософта
Отдельное спасибо. Не знал.
Но тут же возникает вопрос, мой кристал диск инфо нечего об этом не говорит, а по идее мог бы и сказать. Хотя он даже 64мб кеш на моем системном винте не видит. Вот ещё один повод расширить функционал.
 

Prog

Продвинутый
Сообщения
484
Репутация
57
DeviceIOControl http://www.vsokovikov.narod.ru/New_MSDN_API/Device_io/fn_deviceiocontrol.htm
В двух словах, открываете диск функцией CreateFile и используете его хендл в вызовах DeviceIOControl.
Функция требует входной буфер и выходной. Какими они будут зависит от команды.

Примеры использования функции
 
Автор
D

DyadyaGenya

Знающий
Сообщения
299
Репутация
9
DeviceIOControl http://www.vsokovikov.narod.ru/New_MSDN_API/Device_io/fn_deviceiocontrol.htm
В двух словах, открываете диск функцией CreateFile и используете его хендл в вызовах DeviceIOControl.
Функция требует входной буфер и выходной. Какими они будут зависит от команды.
Ссылку видел уже не один раз. И к сожалению, в двух словах не понимаю. Хотел бы пример.
Примеры использования функции
Тут же оба примера с помощью WinAPI. Там вроде ничего нет про DeviceIOControl
 

AZJIO

Меценат
Меценат
Сообщения
2,814
Репутация
1,170
Попробуйте скопируйте и увидите проседание скорости
Видел на протяжении 20 лет, на всех моих флешках.

На счёт черепичный я подумал что речь о дисках которые 2-3-4 в одном. Максимальный объём диска 2.5` дюйма 2 Тб, если указано 8 Тб, то это 4 диска соединены в один. Наверно и у него кэш будет выше по сумме дисков, и скорость, если он будет писать сразу на 4 физических диска.

Этот тест называется скорость линейного чтения/записи. Но необходим также тест чтения/записи мелких блоков данных от множества приложений (винда многозадачная). Потому что именно такой вид записи чаще всего встречается в системе (винда что-то пишет в фоне, браузеры читают/пишут в кэш/из кэеша).
У меня подозрение, что скорость будет пропорциональна линейному чтению. А если это будет не так, то это будет зависеть уже от внутреннего кэша жёсткого диска. То есть тестим линейную запись и учитываем размер кэша. Если писать мелкими файлами, то надо генерировать одинаковый разброс данных, чтобы создать равные условия. Но для меня настоящим является линейная запись, а мелкими файлами это всё равно линейная кусками, добавиться время на способность быстро делать запись в MFT, а тут я не уверен является ли существующий MFT уже заполненный и писать в пустой и заполненный миллионами файлов, будет ли это создавать ложное определение скорости.

DyadyaGenya
Смотрю я на это всё и думаю, на AutoIt3 я привык использовать переменные и когда возникал вопрос работы с памятью и указателями старался использовать готовый код. В PureBasic почти половину кода надо работать с данными в памяти. То есть к тому, что я уже привык в PureBasic, я не знаю как это делается на AutoIt3, ну или хотя бы приближённо. Я не пользовался _MemVirtualAlloc() и подобными... Хотя может там нужно DllStructGetPtr()
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
484
Репутация
57
Хотел бы пример.
Ищите описание команды. В нем должен быть ее номер и формат данных во входном и выходном буфере.
Заполняете входной буфер, выделяете помять под выходной и вызываете DeviceIoControl с номером команды и адресами буферов. Если вызов прошел успешно, разбираете данные из выходного буфера.
То есть вызовом функции DeviceIOContro вы сообщаете драйверу какие данные нужны. Он их запрашивает у диска и помещает в выходной буфер.
Допустим нужно получить информацию о разделах.
Описание команды IOCTL_DISK_GET_PARTITION_INFO с примером вызова DeviceIoControl https://learn.microsoft.com/en-us/w...ctl/ni-winioctl-ioctl_disk_get_partition_info
Структура PARTITION_INFORMATION выходного буфера которую заполняет драйвер https://learn.microsoft.com/en-us/windows/win32/api/winioctl/ns-winioctl-partition_information
Пример вызова DeviceIoControl с результатом выполнения DeviceIoControl на примере диска C:

IO.png

В окне просмотра переменных поля структры выделены прямоугольником.

Тут же оба примера с помощью WinAPI. Там вроде ничего нет про DeviceIOControl
DeviceIoControl это и есть WinAPI функция.

На счёт черепичный я подумал что речь о дисках которые 2-3-4 в одном.
Это уплотненная запись на диск. Уплотнение означает что для записи даже одного байта нужно переписать несколько дорожек, а это сотни мегабайт. Из-за чего диски медленные.

У меня подозрение, что скорость будет пропорциональна линейному чтению.
У SSD нет.
 
Автор
D

DyadyaGenya

Знающий
Сообщения
299
Репутация
9
DeviceIoControl это и есть WinAPI функция
Видимо я не туда куда-то смотрел или вообще все забыл, или не знал, не знал, да и забыл. Что-то мне казалось, что WMI, он же WinAPI не тоже самое, что DeviceIOControl. Хотя опять же, негде было учиться, оттого и каша в голове.
Описание команды IOCTL_DISK_GET_PARTITION_INFO с примером вызова
К сожалению в таком виде мне этот пример ничего не говорит.
А пример на PureBasic тоже не пролил свет.
я не знаю как это делается на AutoIt3, ну или хотя бы приближённо.
Я и сам многие вещи не помню. Надо поднимать старые скрипты на старом винте.
 

Prog

Продвинутый
Сообщения
484
Репутация
57
К сожалению в таком виде мне этот пример ничего не говорит.
В каком виде пример что-то "скажет"?
Нужно уметь читать описание функций и применять их на практике тем более что предоставлен простой пример пусть и на другом ЯП.
Не нужно боятся экспериментировать. Начните писать и если код не работает как должен ищите причину этого и исправляйте ошибки.
Это основы программирования.
 

AZJIO

Меценат
Меценат
Сообщения
2,814
Репутация
1,170
DyadyaGenya
WMI это объект, которому применяются методы (как в JavaScript), а WinAPI это функция с параметрами, иногда не понятными, так как имеет собственную типизацию. У меня в ChkDskGui оказывается 3 раза вызывается функция DeviceIoControl. Можно оттуда брать или искать на офсайте, проверил кучу вариантов даёт в результатах поиска, так что это не что-то недоступное. Ведь ранее ChkDskGui была написана на AutoIt3, уже понятно что примеры были. Вот я использовал этот пример для возврата номер диска для ChkDskGui. Там можно флаги менять чтобы запросить другие параметры, хотя не всегда так просто, фактически надо второй параметр dwIoControlCode определить, чтобы получить какую либо инфу, а результатом будет указатель на структуру в 5-ом параметре - lpOutBuffer. И вот эта структура может быть сложной, может даже самому придётся делать. То есть надо найти какие флаги поддерживаются и какие структуры возвращается для этих флагов.
Вот как искать с подсветкой в примере с температурой 12 вызовов (скриншот), смотри изучай, сопоставляй с примером на AutoIt3.
Ещё пример (LEGACY/UEFI, MBR/GPT)
ChkDskGui с upload.ee, там посмотри в исходнике файл RAW.pb , константа IOCTL_DISK_GET_DRIVE_GEOMETRY_EX возвращает геометрию диска в полях структуры, а у меня используется для возвращения размера RAW дисков, то есть не форматированных. Google пишет:
Извлекает расширенную информацию о геометрии физического диска: тип, количество цилиндров, дорожки на цилиндр, сектора на дорожку, байты на сектор и размер.
Сделал поиск по файлам au3 в папке \AutoIt\Include\ выдал 18 результатов DeviceIoControl, в том числе геометрия диска. Так что у вас тонна примеров для использования.

Вот команды из кода температуры, можно копировать константу и гуглить её назначение и решать, пригодится ли она для вывода какой либо информации.
Result = DeviceIoControl_(hDrive, #IOCTL_DISK_GET_PARTITION_INFO, #Null, 0, @bb, SizeOf(PARTITION_INFORMATION), @BytesRet, 0) DeviceIoControl_(hdh, #DFP_SEND_DRIVE_COMMAND, @bin, SizeOf(SENDCMDINPARAMS), @bout, SizeOf(SENDCMDOUTPARAMS), DeviceIoControl_(hdh, #IOCTL_SCSI_MINIPORT, @buffer(), SizeOf(SRB_IO_CONTROL) + SizeOf(SENDCMDINPARAMS) - 1, @buffer(), status = DeviceIoControl_(hdh, $4d004, @pswb, SizeOf(t_SPTD), @pswb, Length, @returned, @OL) ReadAttributesCmd = DeviceIoControl_(hdh, #DFP_RECEIVE_DRIVE_DATA, @bin, SizeOf(SENDCMDINPARAMS), @bArrOut(), 528, @cbBytesReturned, 0) bRet = DeviceIoControl_(hdh, #IOCTL_SCSI_MINIPORT, @buffer(), SizeOf(SRB_IO_CONTROL) + SizeOf(SENDCMDINPARAMS) - 1, @buffer(), ReadAttributesCmd = DeviceIoControl_(hdh, #DFP_RECEIVE_DRIVE_DATA, @bin, SizeOf(SENDCMDINPARAMS), @bArrOut(), 528, @cbBytesReturned, 0) bRet = DeviceIoControl_(hdh, #IOCTL_SCSI_MINIPORT, @buffer(), SizeOf(SRB_IO_CONTROL) + SizeOf(SENDCMDINPARAMS) - 1, @buffer(), Result = DeviceIoControl_(hdh, #DFP_RECEIVE_DRIVE_DATA, @bin, SizeOf(SENDCMDINPARAMS), @bout(), 528, @dummy, 0) Result = DeviceIoControl_(hdh, #IOCTL_SCSI_MINIPORT, @buffer(), SizeOf(SRB_IO_CONTROL) + SizeOf(SENDCMDINPARAMS) - 1, @buffer(), i = DeviceIoControl_(hdh, #IOCTL_DISK_GET_DRIVE_LAYOUT, #Null, 0, @aa, SizeOf(DRIVE_LAYOUT_INFORMATION), @BytesRet.l, 0) Result = DeviceIoControl_(hdh, $2D1400, udtQuery, SizeOf(udtQuery), @udtOut, SizeOf(udtOut), @dwOutBytes, 0)
 
Последнее редактирование:
Автор
D

DyadyaGenya

Знающий
Сообщения
299
Репутация
9
В каком виде пример что-то "скажет"?
В готовом с пояснениями.
Нужно уметь читать описание функций и применять их на практике тем более что предоставлен простой пример пусть и на другом ЯП.
Как-то у меня слабо идет понимание всего, что написано про autoit, тем более про С++. Даже тут на форуме часто говорил, что почему-то PHP и пайтон по их справочникам понял гораздо проще. И те же API напр для телеграма разобрал, делал варианты как под пайтон, так и под пхп. А вот под autoit не получилось, хотя тут есть работа с http.
там посмотри в исходнике файл RAW.pb
Там же PureBasic. Меня Си пугает, и PureBasic разве что чуток меньше )))
Сделал поиск по файлам au3 в папке \AutoIt\Include\
Не сталкивался раньше с такой программой. Не нашел в её описании, как делать поиск, а не замену. Менять искомую фразу на себя?
Вот команды из кода температуры
Это из тех результатов поиска в Include?
 

Prog

Продвинутый
Сообщения
484
Репутация
57
В готовом с пояснениями.
Готовый пример на скрине.
Пояснения

Как-то у меня слабо идет понимание всего, что написано про autoit, тем более про С++.
Описание команд для DeviceIoControl вне контекста какого либо языка, то есть принцип одинаков для всех ЯП с учетом поправки на их синтаксис.
Ищите примеры программ с DeviceIoControl, изучайте как они устроены и тогда придет понимание. А если ничего не делать, то ничего не поймете и не научитесь.

Прочитайте литературу для начинающих и сможете читать программы и понимать их.
 
Последнее редактирование:
Автор
D

DyadyaGenya

Знающий
Сообщения
299
Репутация
9
Готовый пример на скрине
Если под примером имелось ввиду вот это:
то там пример на PureBasic. не хотелось бы тратить время на изучение ещё одного языка. Хотел пример именно реализации на autoit.
Про эти пояснения я уже несколько раз пояснял, что не понимаю их. Мне обычными словами пояснить, как для тупого, поскольку я и есть туповатый человек.
Ищите примеры программ с DeviceIoControl, изучайте как они устроены и тогда придет понимание. А если ничего не делать, то ничего не поймете и не научитесь.
Все примеры, которые я видел до сих пор написаны на С++ или вот ещё увидел на PureBasic. Для меня это темный лес. Хотелось бы примеры на autoit
Прочитайте литературу для начинающих и сможете читать программы и понимать их.
Я уже говорил, что не знаю, сколько у меня ещё времени есть. Не хотелось бы его тратить на изучение следующего языка, который пока что нужен только для одной единственной цели.
Поэтому просьба, сделайте хотя бы один пример, лучше три, написанных на autoit:
1. Как определить температуру диска.
2. Как определить контроллер диска.
3. Как определить буфер диска.
 
Верх