Показать полную графическую версию : Счётчик.
Как написать числа от 1 до 1000000.
Средствами .bat
Можно и .vbs
megaloman
27-12-2020, 19:31
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)
Если нужен вывод не на консоль, а в файл:
Код:
>"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
только вместо %i,нужно %%i »
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
так же: »
Нет, так:
@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
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
megaloman, а зачем такие сложности? Операции над строками одни из самых медленных. Ваш скрипт выполняется у меня за 26 секунд. Тупой перебор 1...1000000 с выводом выполняется у меня за 7 секунд.
megaloman
28-12-2020, 00:40
Iska, посчитал, что так будет быстрее, видимо ошибся, высплюсь, проверю.
PowerShell range (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_operators?view=powershell-7.1#range-operator-)
1..100500 >> "$env:userprofile\100500.txt"
Set-Content c:\test.txt (1..1000000)215ms
215ms »
SSD?
megaloman, вообще — да: когда-то коллективно игрались на предмет того, эффективно ли делать вывод больших объёмов текста блоками строк (по сравнению с байтовым), и, если да — то какими именно. Насколько помнится, оптимальные цифры «крутились» вокруг 512-4096 байт — у разных участников.
SSD? »
SSD! (https://www.goplextor.com/ru/Product/Detail/M9Pe(Y)#/Features)
Но сам SSD - не панацея:
1..1000000>> c:\test.txt »21sec
SSD! »
Спасибо, ясно.
Но сам SSD - не панацея: »
Конечно. Будет время — попробую проверить, нет ли в этом того же самого миллиона «приседаний».
megaloman
28-12-2020, 09:08
Iska, Прямой перебор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%.
21sec »
Я-то думал, что тут самыми короткими пиписьками меряются, а оказалось - кто быстрее закончит :)
Оптимизация пределов цикла по скорости выполнения. Результат: снижение времени выполнения ~20 раз »
О!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.