<?php // Полная загрузка сервисных книжек, создан 2025-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
///// echo '<H2><b>Старт загрузки</b></H2><br>';
$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
///// echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}
$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
///// echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}
/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
///// echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
///// echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist); ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7]; ////получаем размер файла
$m_mtime_file=$masiv_data_file[9]; ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file
///// echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
///// echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
///// echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);
if ($results)
{ foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));
////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
///// echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
///// echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}
////загружаем данные
$table='vin_history'; // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация // (путь от корня web-сервера)
$delim=';'; // Разделитель полей в CSV файле
$enclosed='"'; // Кавычки для содержимого полей
$escaped='\
Предлагаю в тело публикации добавлять полученные алгоритмы и сделать общий тест на это дело.
Давайте только опишем какие функции нужно оптимизировать
Нужно было заводить не статью, а группу
Обновил публикацию.
По тестированию предполагаю использовать юнит-тестирование в том виде, как выкладывал в ветке по RegExp.
(3) Публикацию можно расширить.
(5) Расширил публикацию.
Выложил Тест_РазложитьСтрокуВМассивПодстрок.epf
4 сравнения —
Выполнений: 1 000 Функции из Бух 1.6 и КОРП 2.0 время: 797 мс
Выполнений: 1 000 функций на RegExp время: 1 016 мс
Выполнений: 1 000 функций на VBScript время: 390 мс
Выполнений: 1 000 Функции ЗначениеИзСтрокиВнутр время: 641 мс
(6) «из Бух 1.6 и КОРП 2.0» — это тоже оптимизированный мною вариант. «Родной вариант» выглядит несколько иначе. Он есть в первоначальном варианте теста изhttp://www.infostart.ru/public/64222/ Тест прикрепил к сообщению.
Предлагаю включить его «как есть», т.е. не загонять в 1 строку. Тогда разница в производительности будет очевиднее.
И еще замечание по замерам в тестах. На полученные результаты тестирования влияют циклы. Что искажает время результатов. Нужно из результатов тестов исключать время на циклы. Тогда останется только время выполнения самих функций. Примеры таких тестов можно посмотреть здесьhttp://www.infostart.ru/public/19021/
+7 …что-то тест не прикрепился 🙁
(8) В подфоруме завел новую тему по этой функции
(8) ОФФ. Я тебе по разукрашке ответил — не очень удобно работать 🙂
(7) Исправился — исключил время циклов.
(12) Женя правильно сказал, что ради подобной функции не нужно юзать отдельную компоненту.
Вполне можно написать простой код на ВБ-скрипт и оформить его в виде отдельной функции 1С или класса 1С.
Да и сортировка массива ИМХО довольно редкий случай, намного чаще работаешь с сортировкой других коллекций.
(12) Завел новую подтему «Сортировка массива»
http://infostart.ru/public/64770/forum/topic/30873/
(13) в УТ нашел два места, где тупым перебором ищется значение в массиве
Еще кандидаты на оптимизацию из общего модуля «ОбщегоНазначения»
ТолькоЦифрыВСтроке
ВыделитьСлово
ЕстьНеЦифры
МассивыИдентичны
УдалитьНеЗаполненныеЭлементыМассива
УдалитьПовторяющиесяЭлементы
УдалитьПовторяющиесяЭлементыМассива
только цифры:
Попытка
нн = Число(Тестстрока);
Исключение
Сообщить(«блин, не только цифры…»);
КонецПопытки
лучше бы закрытие месяца в типовых БП на SQL базах оптимизировали бы 🙂
(18) на этом сайте уже выложено несколько вариантов оптимизаций
(17) Блок Попытка-КонецПопытки очень медленный как правило.
Нужно потестить подобное преобразование 🙂
Артур — тут такое дело
вот такой тест
не пройдет на функции ОбщегоНазначенияАльтернативный.РазложитьСтрокуВМассивПодстрок
с ошибкой компиляции VBScript из-за недопустимого знака
сейчас пробую сделать так чтобы тест проходил
(21)
блин, а не получается пока с наскока придумать как обойти это финт — туплю наверное 😐
(21) «Не пройдет» или уже не проходит? ты в реале протестил?
(23) вечно я недоформулирую
«Не прошел» имелось ввиду;
у меня выдало в реальности, я и написал тест (как Федор советовал — добейтесь вначале чтобы тест не проходил)
«требуется предварительная инициализация» каким образом?
(25) До вызова быстрого основного метода РазложитьСтрокуВМассив
предварительно нужно где-то вызвать метод Инит() — он довольно тормозной 🙁
Вообще, мне кажется данная «оптимизация» палка о двух концах. Из одного интерпретатора передавать управление на исполнение кода в другой=)
Тут наверное стоит подходит со стороны. что можно сделать средствами 1ц, а что средствами сторонних скриптовых движковВК. И на сколько я знаю обмен и взаимодействие по технологии COM достаточно ресурсоемкий (процессор, оперативная память), и данный вывод я делаю не как разработчик на 1ц, а как системный программист, 1ц — это «дуновение потребностей»=) Т.е. например когда действительно нужно применить регулярку, имеет смысл использовать JS регулярку=)
А вообще конечно хотелось бы увидеть примеры замеров производительности (обязательно раз по 10 как минимум, с средним арифметическим) 😎
результаты тестов зависят от многих факторов. Например, большая часть времени уходит на создание обьекта (New RegExp) , на чем часто играют создатели, так сказать, «более быстрых альтернатив». Если же он создан и уже весит в памяти , то отработает, наверняка, быстрее всех. Хотя, Split() — это слишком примитивно.
Во-вторых, существенно влияет последовательность тестов. Т.е., что вы тестируете первым, то и покажет лучшие СВОИ результаты. Это связанно с оперативной памятью. (Кто-то ранее заметил, что запись в одну переменную — но физически это не так.)
RegExp — проверенный временем обьект, очень мощный и нужный. Главный минус, что он сторонный/внешний и ОСевой.
(Могу ошибаться, но в учебных платформах 1C com-обьекты тоже не подключаются. )
И всё же, при всех плюсах RegExp-a, желательно использовать стандартные наборы функций. Впринципе, это закон любой седы.
Реализовать такой обьект, как RegEx, в 1с не реально, имхо! Лучше лоббировать его включение и оптимизацию в саму платформу.
Сейчас, конечно, я уже не найду результатов тестирования, 5 лет все-таки прошло 🙂
Но проверял на нескольких разных алгоритмах, естественно, на большом количестве выполнений.
(28) >существенно влияет последовательность тестов
Не соглашусь.
Нет такой явной зависимости от последовательности выполнения
(30) Ну, я только знакомлюсь с 1с, так что, извините, 2010 для меня тоже самое что и 2020. 🙂
http://infostart.ru/public/64222/) нужно проводить на идеально «вылизанных» машинах: без лишних служб, без сетей, без антивирусов и тп, что может «тормознуть» ОС на мгновение. И то… В общем, если проводить тесты, то уж на максимальных нагрузках.
Имеется ввиду, если тест идет одной процедурой, последовательно.
Когда-то давно, тестировал ADO vs DAO на создание нескольких десятков и даже сотен тысяч строк в таблице… Впоследствии выяснилось, , последний покажет худший СВОЙ результат, чем будь он первым. Понимаете, даже хранение результатов первого теста в переменной уже уменьшает оперативную память, что приведет к более медленной отработке второго теста.
Такие «микротесты» (и тут
>…на большом количестве выполнений.
Разбейте томик К.Маркса на слова, например, где результаты будут более 5 сек, хотя бы.
ps: Еще, подозреваю, что скорость wscript и сscript разная и точно зависит от установленных комплексов защиты компьютера и их настройки. Т.е. на разных машинах, результаты могут отличаться.
А на чем работает 1с при Eval()(Выполнить()) или на дефолте в системе?
Реализовано в версии 8.3.6.1977 функции: СтрРазделить(), СтрСоединить()
https://infostart.ru/public/366865/
Читаем тут: