Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Софт
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2018, 15:04   #1
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,503
По умолчанию Shift time

Написал новую программу и... о, тормоз! Она работает минут 5!
Подскажите, как её оптимизировать.
Язык Visual Basic 5.0. Операционная система Windows 95. Процессор Celeron 333.
Логика вся правильная, проверял. Для моего случая подходит. Во вложении все файлы есть.
Код:
Rem   Shift time
Rem   Язык Visual Basic 5.0
Rem   Смещение тайминга субтитров *.srt

Option Explicit

Private Sub C1_Click()
    Dim a As String: Rem - Буферный массив хранения символов
    Dim b, c, d, e As String
    
    Dim g As Long: Rem - Указатель на считываемый символ
    Dim h As Long: Rem - Время смещения в миллисекундах
    Dim i As Long: Rem - Смещаемое время в миллисекундах
    Dim j, k, l, m As Long
    
    Rem - Инициализация
    g = 1
    h = Val(T2) * 1000
    T3 = ""
    
10   Rem - Цикл обработки данных блока T1
    a = Mid(T1, g, 12)
    If Mid(a, 3, 1) = ":" And Mid(a, 6, 1) = ":" And Mid(a, 9, 1) = "," Then
        Rem - Собираем из строки число
        b = Mid(a, 1, 2)
        c = Mid(a, 4, 2)
        d = Mid(a, 7, 2)
        e = Mid(a, 10, 3)
        
        i = ((b * 60 + c) * 60 + d) * 1000 + e
        i = i + h
        If i < 0 Then i = 0
        
        Rem - Разбираем число на строку
        m = i
        l = m \ 1000: m = m - l * 1000
        k = l \ 60: l = l - k * 60
        j = k \ 60: k = k - j * 60
        
        If j < 10 Then T3 = T3 & "0"
        T3 = T3 & j & ":"
        If k < 10 Then T3 = T3 & "0"
        T3 = T3 & k & ":"
        If l < 10 Then T3 = T3 & "0"
        T3 = T3 & l & ","
        If m < 100 Then T3 = T3 & "0"
        If m < 10 Then T3 = T3 & "0"
        T3 = T3 & m
        
        g = g + 12
    Else
        T3 = T3 + Mid(a, 1, 1)
        g = g + 1
    End If
    
    Rem - Если блок T1 не закончился, то повторение цикла
    If Len(a) > 11 Then GoTo 10
    T3 = T3 + Mid(a, 2, 10)
End Sub
Изображения
Тип файла: png Image a.png (51.4 Кб, 121 просмотров)
Тип файла: png Image2 a.png (45.4 Кб, 117 просмотров)
Вложения
Тип файла: txt Program.txt (1.6 Кб, 114 просмотров)
Тип файла: 7z Shift time.7z (131.4 Кб, 10 просмотров)
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...
jura_k вне форума Ответить с цитированием
Старый 07.09.2018, 15:33   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

А вы как хотели, используя самый неоптимальный алгоритм?.. Начните с построчного анализа.
p51x на форуме Ответить с цитированием
Старый 07.09.2018, 19:55   #3
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,503
По умолчанию

Самый первый попавшийся. Который работает. Берёшь и делаешь.
Тут ещё непонятно, в какой части алгоритма тормоза. В той, где идёт расчёт, или там, где идёт "отбор кандидатов на расчёт". Может быть и то, и то.
Жутко разочаровал этот язык. На языке C всё исполнилось бы за считанные секунды. И не пришлось бы голову ломать.
Пожалуй, брошу-ка я эту задачу. Перейду к другим, где нет массивной обработки данных. Не факт, что такие опять попадутся.
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...
jura_k вне форума Ответить с цитированием
Старый 08.09.2018, 07:46   #4
kvitaliy
Участник клуба
 
Регистрация: 17.05.2011
Сообщений: 1,660
По умолчанию

Цитата:
Сообщение от jura_k Посмотреть сообщение
Жутко разочаровал этот язык. На языке C всё исполнилось бы за считанные секунды.
Переписал на другой Basic. Время выполнения 0.05 Секунды.
Вложения
Тип файла: zip Shift time.zip (176.5 Кб, 11 просмотров)
kvitaliy вне форума Ответить с цитированием
Старый 08.09.2018, 12:04   #5
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,503
По умолчанию

Спасибо за труды. Все ваши файлы отправлены в антивирусный центр на проверку.

Но у меня мой *.exe-файл всё равно не запускается. Потому что он создавался для Windows 95, а тут я использую Windows Vista. Вот что он пишет:
- не найден файл "msvbvm50.dll", так как в данной версии Windows он не содержится -

Когда я говорил, что время работы 5 минут - это на процессоре Celeron 333. Здесь у меня Pentium 1800, и мне удалось его запустить, но не под Windows Vista, а под Windows XP. Время работы примерно 10-20-30 секунд, точно не помню.

Почему я вообще взялся переписать программу - сейчас я использую "Time shift", написанную на Visual C 9 (консольное приложение), оно мне то же самое делает за 1 секунду.
Вот только там время можно смещать лишь на целое число секунд, так как программа делалась очень давно. Это не совсем удобно.
Вложения
Тип файла: 7z Evangelion.7z (40.6 Кб, 9 просмотров)
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...
jura_k вне форума Ответить с цитированием
Старый 08.09.2018, 12:07   #6
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,503
По умолчанию

Я решил отложить решение задачи, потому что ждать столько времени на конвертацию мне не хочется, даже если бы программа работала на этом компьютере. А сейчас я занимаюсь "Visual Basic 5", эту задачу взялся делать лишь мимоходом, там ещё много чего есть, что можно сделать.
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...
jura_k вне форума Ответить с цитированием
Старый 08.09.2018, 12:13   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Вы хотите в программировании разобраться или по форумам поныть? Зачем вы убегаете от простейших трудностей? Тем более вам указали проблемы и первые шаги в решении?
p51x на форуме Ответить с цитированием
Старый 08.09.2018, 14:30   #8
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,503
По умолчанию

А зачем разбираться с трудностями, когда ясно одно: виноват язык программирования; и чтобы решить задачу, его надо менять. Но я пока остаюсь с языком программирования, потому что там есть другие задачи, другие книги. Не собираюсь останавливаться на достигнутом.
Программа работает долго из-за автоматического преобразования типов в языке. Фиксить это не собираюсь. Это задумка авторов языка.

Кстати, что вы имели ввиду, говоря "построчный анализ"? Построчный анализ самой программы, или же выполнить построчный анализ исходных данных, составив другой алгоритм?
Что касается самой программы, то я сочинял так, чтобы было покороче и работало.
Я новичок в этом языке, а толковых мануалов не брал. У меня книжка, где есть кое-что, но не всё. И ещё Help помогает.
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...

Последний раз редактировалось jura_k; 08.09.2018 в 14:36.
jura_k вне форума Ответить с цитированием
Старый 08.09.2018, 15:43   #9
kvitaliy
Участник клуба
 
Регистрация: 17.05.2011
Сообщений: 1,660
По умолчанию

Цитата:
Сообщение от jura_k Посмотреть сообщение
Я новичок в этом языке
Да не в языке дело, а в алгоритме. Нерационально.
Цитата:
Сообщение от jura_k Посмотреть сообщение
то я сочинял так, чтобы было покороче
Было бы гораздо короче и рациональней открыть нужный файл на чтение, не ползать Mid ом по всему тексту, а только в тех местах, где это необходимо, сделать отделенную функцию преобразования цифр, и естественно, запись в новый файл изменённых данных.
Я так понимаю, как работать с файлами в VB5 вы так и не поняли?

Считать файл в строковую переменную:
Код:
Dim textline As String
textline = Space(FileLen("c:\local.set"))
fo = FreeFile
Open "c:\local.set" For Input As #fo
textline = Input(LOF(fo), #fo)
Close #fo
Сохранить изменённый файл
Код:
' Сохраняем в файл
FileNum = FreeFile
Open "c:\local.set" For Output As FileNum
Print #FileNum, textline
Close #FileNum
Считать 1 строку
Код:
Dim MyFile 'Объявляем переменную для свободного файла
Dim S As String 'Переменная для хранения считанных данных
MyFile = FreeFile ' Присваиваем свободный канал, для работы с файлами
Open ("C:\TEST.txt") For Input As #MyFile 'Открываем файл TEST.TXT для чтения
Line Input #MyFile, S 'Считываем первую строку из файла TEST.TXT в переменную S
Close #MyFile 'Закрываем файл
Все строки в цикле:
Do Until EOF(MyFile)

Цитата:
Сообщение от jura_k Посмотреть сообщение
файлы отправлены в антивирусный центр на проверку.
Не смешите мои тапки, на вашем W95 даже нормальный вирус уже не станет работать, уже ни кто не помнит, как для такого утиля можно написать что то разрушительное - эта система сама без вируса работает через раз.
Чего вы боитесь?
kvitaliy вне форума Ответить с цитированием
Старый 08.09.2018, 16:27   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от jura_k Посмотреть сообщение
Кстати, что вы имели ввиду, говоря "построчный анализ"? Построчный анализ самой программы, или же выполнить построчный анализ исходных данных, составив другой алгоритм?
Я же вроде весь пост про алгоритм писал тогда... Вы не знаете формата srt? В нем нет смысла в 2/3 строк искать ваши метки времени, а уж тем более гонять весь текст сдвигая по 1 символу.
p51x на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pitch Shift vovken1997 Общие вопросы Delphi 1 05.07.2012 20:02
Реакция на Shift a_n_n_a Общие вопросы Delphi 3 22.06.2011 13:36
Shift _-Re@l-_ Общие вопросы Delphi 11 24.05.2010 21:52