Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Счётчик. (http://forum.oszone.net/showthread.php?t=347464)

serg515 27-12-2020 17:40 2944350

Счётчик.
 
Как написать числа от 1 до 1000000.
Средствами .bat
Можно и .vbs

YuS_2 27-12-2020 19:03 2944356

Зачем?

megaloman 27-12-2020 19:31 2944361

serg515, что вы хотите получить, в каком виде?

Iska 27-12-2020 20:03 2944365

Цитата:

Цитата serg515
Как написать цифры от 1 до 1000000. »

Нет таких цифр. Есть числа.

Напишите непосредственно в командной строке:
Код:

for /l %i in (1, 1, 1000000) do @echo %i
Если нужен вывод не на консоль, а в файл:
Код:

>"Out.txt" (for /l %i in (1, 1, 1000000) do @echo %i)

serg515 27-12-2020 20:40 2944368

Цитата:

Цитата Iska
Если нужен вывод не на консоль, а в файл:
Код:
>"Out.txt" (for /l %i in (1, 1, 1000000) do @echo %i) »

работает. только вместо %i,нужно %%i
или
Код:

for /l %%x in (1, 1, 1000000) do echo %%x>>C:\Out.txt
так же:
Код:

@echo off
set a=1
:start
>>Out.txt echo %a%
if "%a%"=="1000000" (exit)
echo %a%
set /a a=%a%+1
goto start


Iska 27-12-2020 22:32 2944377

Цитата:

Цитата serg515
только вместо %i,нужно %%i »

serg515, я написал русским языком и даже выделил — «в командной строке».

Цитата:

Цитата serg515
или »

Заморитесь ждать. Пример выше один раз открывает файл и пишет в него «до упора», потом закрывает. Ваш пример — делает миллион приседаний раз последовательность действий «открыть файл, дописать в него строку, закрыть файл». Даже с учётом кэширований, это много больше по времени.

Вот на 20000 у меня:
Скрытый текст
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

echo %time%
>"Out1.txt" (for /l %%i in (1, 1, 20000) do echo %%i)
echo %time%
for /l %%i in (1, 1, 20000) do echo %%i>"Out2.txt"
echo %time%

endlocal
exit /b 0

Цитата:

Код:

22:31:42.32
22:31:43.38
22:31:50.62




Цитата:

Цитата serg515
так же: »

Нет, так:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set /a iCount = 0
2>nul del /f /q "Out.txt"

:Repeat
        set /a iCount += 1
        >>"Out.txt" echo %iCount%
        if %iCount% lss 1000000 goto :Repeat
)

endlocal
exit /b 0

Опять же, этот построчный вывод много медленнее «пакетного».

megaloman 28-12-2020 00:00 2944385

vbs
Код:

Filename = "Z:\Box_Out\aaa.txt"

With CreateObject("Scripting.FileSystemObject")
    Set fOut = .CreateTextFile(Filename, True)
    fOut.Close
               
    Set fOut = .OpenTextFile(Filename, 8, False)

    For j = 1 To 999901 Step 100
        fOut.Write iii(j, j + 99)
    Next
   
    fOut.Close
End With

Function iii(i1, i2)
    If i1 = 1 Then
        ii = CStr(i1)
    Else
        ii = vbCrLf + CStr(i1)
    End If
   
    For i = i1 + 1 To i2
        ii = ii + vbCrLf + CStr(i)
    Next
    iii = ii
End Function


Iska 28-12-2020 00:20 2944389

megaloman, а зачем такие сложности? Операции над строками одни из самых медленных. Ваш скрипт выполняется у меня за 26 секунд. Тупой перебор 1...1000000 с выводом выполняется у меня за 7 секунд.

megaloman 28-12-2020 00:40 2944391

Iska, посчитал, что так будет быстрее, видимо ошибся, высплюсь, проверю.

Vadikan 28-12-2020 01:04 2944393

PowerShell range
Код:

1..100500 >> "$env:userprofile\100500.txt"

Fors1k 28-12-2020 02:04 2944398

Код:

Set-Content c:\test.txt (1..1000000)
215ms

Iska 28-12-2020 02:56 2944401

Цитата:

Цитата Fors1k
215ms »

SSD?


megaloman, вообще — да: когда-то коллективно игрались на предмет того, эффективно ли делать вывод больших объёмов текста блоками строк (по сравнению с байтовым), и, если да — то какими именно. Насколько помнится, оптимальные цифры «крутились» вокруг 512-4096 байт — у разных участников.

Fors1k 28-12-2020 03:35 2944404

Цитата:

Цитата Iska
SSD? »

SSD!


Но сам SSD - не панацея:
Цитата:

Цитата Vadikan
1..1000000>> c:\test.txt »

21sec

Iska 28-12-2020 07:16 2944408

Цитата:

Цитата Fors1k
SSD! »

Спасибо, ясно.

Цитата:

Цитата Fors1k
Но сам SSD - не панацея: »

Конечно. Будет время — попробую проверить, нет ли в этом того же самого миллиона «приседаний».

megaloman 28-12-2020 09:08 2944415

Iska,
У меня ноут 2007 года. HDD заменил на SSD. Отчитываюсь
Прямой перебор
Код:

T = Timer()
Filename = "Z:\Box_Out\aaa.txt"

Nmax = 1000000

With CreateObject("Scripting.FileSystemObject")
    Set fOut = .CreateTextFile(Filename, True)
    fOut.Close
               
    Set fOut = .OpenTextFile(Filename, 8, False)
   
    For i = 1 To Nmax - 1
        fOut.WriteLine CStr(i)
    Next
    fOut.Write CStr(Nmax)
   
    fOut.Close
End With

MsgBox Timer() - T

Запись блоками
Код:

T = Timer()
Filename = "Z:\Box_Out\aaa.txt"

Nmax = 1000000
Nstep = 100        'Ограничение: NNax должно нацело делиться на Nstep

With CreateObject("Scripting.FileSystemObject")
    Set fOut = .CreateTextFile(Filename, True)
    fOut.Close
               
    Set fOut = .OpenTextFile(Filename, 8, False)
   
    jMax = Nmax - Nstep + 1
   
    For j = 1 To jMax Step Nstep
        If j <> 1 Then
            jj = j
            ss = ""
        Else
            jj = 2
            ss = "1"
        End If
       
        For i = jj To j + Nstep - 1
            ss = ss + vbCrLf + CStr(i)
        Next
        fOut.Write ss
    Next
   
    fOut.Close
End With

MsgBox Timer() - T

Код:

1        20,1        сек
10        4,9        сек
50        3,3        сек
100        3,1        сек
200        3,2        сек
500        3,7        сек
1000        5,1        сек
10000        56,0        сек

Можно, наверное, соптимизировать алгоритм, чтобы записывать не одинаковое количество чисел, а приблизительно одинаковое количество байт, но стОит ли?
Наверное, не всё так универсально, тут соотношение производительности процессора и скорости записи в файл важно.
Кстати, скрипт в качестве макроса Excel при записи по 100 чисел выполнился у меня в 2 раза быстрее, а при прямом переборе -всего на 20%.

Vadikan 28-12-2020 12:11 2944431

Цитата:

Цитата Fors1k
21sec »

Я-то думал, что тут самыми короткими пиписьками меряются, а оказалось - кто быстрее закончит :)

Iska 29-12-2020 03:02 2944494

Цитата:

Цитата megaloman
Оптимизация пределов цикла по скорости выполнения. Результат: снижение времени выполнения ~20 раз »

О!


Время: 19:37.

Время: 19:37.
© OSzone.net 2001-