Последние записи
- Функция рисования для печати на принтере ScanLine
- Функция CharInSet (множества) не работает для русских букв
- Вывод изображений на печать
- Посимвольный перебор строки (сравнение скорости двух методов)
- png в ico с прозрачностью и разными разрешениями
- Автоматическое создание Proxy-файлов видео с камеры DJI Osmo Action 5 Pro для Vegas
- Поиск значения и вставка текса
- Движение image по форме
- Звук в Delphi
- Экранная лупа (линза)
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
14th
Май
Посимвольный перебор строки (сравнение скорости двух методов)
Posted by obzor under CMD/BAT, Windows
Посимвольный перебор строки можно сделать двумя способами:
1. Завести индекс, брать символ в позиции индекса, инкремировать, проверять на достижение конца строки, goto.
2. Перебирать индекс в for, брать символ в позиции индекса, проверять на достижение конца строки, goto.
Сравним оба варианта на скорость работы:
@echo off
setlocal enabledelayedexpansion
:: Формируем строку из 8000 символов
set "str="
for /l %%i in (1,1,8000) do set "str=!str!A"
:: ===== МЕТОД 1: Доступ по индексу =====
echo Method1:
:: Замер времени начала
call :gettick
set start=%errorlevel%
set idx=0
:loop1
set "ch=!str:~%idx%,1!"
if not defined ch goto end1
rem Тут работа с символом в ch...
set /a idx+=1
goto loop1
:end1
:: Замер времени окончания
call :gettick
set end=%errorlevel%
set /a tm=(%end%-%start%)*10
if %tm% lss 0 set /a tm+=24*3600000
echo Time: %tm% ms
echo.
:: ===== МЕТОД 2: Доступ через цикл for =====
echo Method2:
call :gettick
set start=%errorlevel%
:: 8192 - максимально возможная длина строки в CMD
for /l %%i in (0,1,8192) do (
set "ch=!str:~%%i,1!"
if not defined ch goto end2
rem Тут работа с символом в ch...
)
:end2
call :gettick
set end=%errorlevel%
set /a tm=(%end%-%start%)*10
if %tm% lss 0 set /a tm+=24*3600000
echo Time: %tm% ms
echo.
exit /b
:gettick
:: Количество сотых долей секунды, прошедших с начала дня
setlocal
set t=%time: =0%
set /a tick=1%t:~9,2%-100+(1%t:~6,2%-100)*100+(1%t:~3,2%-100)*6000+(1%t:~0,2%-100)*360000
endlocal & exit /b %tick%
Итог на моем компе:
Method1:
Time: 6240 ms
Method2:
Time: 310 ms
Метод с for быстрее аж в 20 раз!
Вывод: для посимвольного перебора строки выгодно использовать цикл for. Так как заранее не знаем длину строки, то верхнюю границу берем по максимуму, а из цикла выходим по if и goto.
P.S. проверка на пустоту через
if not defined ch goto end1
немного быстрее проверки через
if "!ch!"=="" goto end1
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту

пеллетные котлы

Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)


