Войти

Показать полную графическую версию : Счётчик.


serg515
27-12-2020, 17:40
Как написать числа от 1 до 1000000.
Средствами .bat
Можно и .vbs

YuS_2
27-12-2020, 19:03
Зачем?

megaloman
27-12-2020, 19:31
serg515, что вы хотите получить, в каком виде?

Iska
27-12-2020, 20:03
Как написать цифры от 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
Если нужен вывод не на консоль, а в файл:
Код:
>"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
только вместо %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

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

megaloman
28-12-2020, 00:40
Iska, посчитал, что так будет быстрее, видимо ошибся, высплюсь, проверю.

Vadikan
28-12-2020, 01:04
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"

Fors1k
28-12-2020, 02:04
Set-Content c:\test.txt (1..1000000)215ms

Iska
28-12-2020, 02:56
215ms »
SSD?

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

Fors1k
28-12-2020, 03:35
SSD? »
SSD! (https://www.goplextor.com/ru/Product/Detail/M9Pe(Y)#/Features)

Но сам SSD - не панацея:
1..1000000>> c:\test.txt »21sec

Iska
28-12-2020, 07:16
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%.

Vadikan
28-12-2020, 12:11
21sec »
Я-то думал, что тут самыми короткими пиписьками меряются, а оказалось - кто быстрее закончит :)

Iska
29-12-2020, 03:02
Оптимизация пределов цикла по скорости выполнения. Результат: снижение времени выполнения ~20 раз »
О!




© OSzone.net 2001-2012