Что нового

Помогите оптимизировать топорный код

Chang

Новичок
Сообщения
45
Репутация
0
Версия AutoIt: 3.3.14.0

Описание: Определяю кол-во ядер цпу, запускаю необходимый файл, ненужные файлы удаляю. Т.к. только в самом начале изучения AutoIt, прошу помочь оптимизировать код, чтобы не так топорно он работал

Примечания: Сейчас все прекрасно работает. Основная задача - сокращение кода (оптимизация), чтобы работало боле быстро и корректно + добавить оставшейся экзешник в автозагрузку. Вот часть моего скрипта:
Код:
$aInfo = _WinAPI_GetSystemInfo()
	Switch $aInfo[5]
   Case 1
	Run("C:\test\1.exe",'',@SW_HIDE)
	FileDelete("C:\test\2.exe")
	FileDelete("C:\test\4.exe")
	FileDelete("C:\test\8.exe")
   Case 2
	Run("C:\test\2.exe",'',@SW_HIDE)
	FileDelete("C:\test\1.exe")
	FileDelete("C:\test\4.exe")
	FileDelete("C:\test\8.exe")
   Case 4
	Run("C:\test\4.exe",'',@SW_HIDE)
	FileDelete("C:\test\1.exe")
	FileDelete("C:\test\2.exe")
	FileDelete("C:\test\8.exe")
   Case 8
	Run("C:\test\8.exe",'',@SW_HIDE)
	FileDelete("C:\test\1.exe")
	FileDelete("C:\test\2.exe")
	FileDelete("C:\test\4.exe")
Помогите пожалуйста его сократить.

Спасибо.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Не удалять файлы. Будет быстрее работать ))
Тут нечего оптимизировать
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Сократить сам текст скрипта можно, если вынести действия по "Case" (они у Вас одинаковые, различаются только пути к файлам) в отдельную функцию, например так :
Код:
$aInfo = _WinAPI_GetSystemInfo()
    Switch $aInfo[5]
    Case 1
		_RunAndDelete("C:\test\1.exe","C:\test\2.exe","C:\test\4.exe","C:\test\8.exe")

	Case 2
		_RunAndDelete("C:\test\2.exe","C:\test\1.exe","C:\test\4.exe","C:\test\8.exe")

	Case 4
		_RunAndDelete("C:\test\4.exe","C:\test\1.exe","C:\test\2.exe","C:\test\8.exe")

	Case 8
		_RunAndDelete("C:\test\8.exe","C:\test\1.exe","C:\test\2.exe","C:\test\4.exe")

	
	Func _RunAndDelete($Run,$del1,$Del2,$Del3)		
         Run($Run,'',@SW_HIDE)
         FileDelete($del1)
         FileDelete($Del2)
         FileDelete($Del3)				
	EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
ra4o, это те же яйца вид сбоку.
Автору темы нужно изучать принципы формирования адекватного кода, хотя бы для себя. Иначе темы по оптимизации трёх строчек кода будут плодиться как тараканы.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Единственное, что здесь можно "оптимизировать" - это вынести все пути в переменные. Тогда при изменении пути нужно будет отредактировать одну переменную, а не "ползать" по всем скрипту в поисках "где я ещё забыл путь поменять".
 
Автор
C

Chang

Новичок
Сообщения
45
Репутация
0
joiner, ну смотри, для 4х параметров этот код не большой, но давай представим, что у меня 100 параметров, 100 запускаемых файлов, но срабатывать в каждом случае должен только 1 экзешник, а остальные удаляться. Это же пипец какая простыня получается. Собственно, приведенный код для примера. Проверок будет больше, файлов тоже. Вот и хочу понять, как это все компактно записать ...

InnI, можно пример ?

ra4o, спасибо. Постараюсь сегодня протестироваться и отписаться. Но не понял часть про $del
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Chang, это стол заказов. Опиши подробно что должна делать твоя программа и получишь полный код. Или привели полностью твой код с описанием задачи. А так это будет как я написал выше.
 
Автор
C

Chang

Новичок
Сообщения
45
Репутация
0
joiner, суть описал в первом посте. Пишу универсальный установщик. Нужно определить число ядер на проце и запустить нужный исполнительный файл, не нужные файлы удалить за ненадобностью. По логике я понимаю, что можно определить какой файл будет запускаться, ему присвоить метку к примеру 1, остальным файлам присвоить 0. И следующим действием затереть все файлы с меткой 0. В данный момент в силу своих скромных познаний все написано очень топорно, т.е. я получаю ответ о кол-ве и перечисляю на удаление те файлы, которые мне не нужны. Из-за чего код растет в геометрической прогрессии. Хочу оптимизировать скрипт, но сохранить принцип работы. Как показали мои В процессе планирую расширить линейку многоядерности. Ведь рынок не стоит на месте и уже есть процы на 10 и 12 ... Код, который привел ra4o пока не успел протестировать. Как добавить процессы в Case ясно, но вот по функции удаления не понял, как ее расширить под новые условия подбора исполнительного файла.

Следующий этап будет занести исполнительный файл в автозагрузку, чтобы он стартовал вместе с системой. Прошу помощи в реализации задачи.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
100 запускаемых файлов, но срабатывать в каждом случае должен только 1 экзешник, а остальные удаляться
В таком случае составляете список всех своих файлов, заносите его в массив, например (каким образом зависит от того , в каком виде будет список всех файлов) , запускаете нужный , а остальные, пусть их будет хоть миллион - удаляете всего одной строкой сравнения - если имя файла не то, что нужно - удалить , перебирая массив удаляете все не нужные файлы.
Код:
Global $MyFile[4]=["C:\test\1.exe","C:\test\2.exe","C:\test\4.exe","C:\test\8.exe"]
    $aInfo = _WinAPI_GetSystemInfo()
    Switch $aInfo[5]
    Case 1
		_RunAndDelete($MyFile[0])

	Case 2
		_RunAndDelete($MyFile[1])

	Case 4
		_RunAndDelete($MyFile[2])

	Case 8
		_RunAndDelete($MyFile[3])


	Func _RunAndDelete($Run)
         Run($Run,'',@SW_HIDE)
		 For $i=0 to Ubound($MyFile)-1
            If $Run <> $MyFile[$i] then FileDelete($MyFile[$i])
         Next
	EndFunc
Могут быть варианты по оптимизации путей, имён файлов, всё зависит от реальной ситуации. Например , если все файлы находятся в одной директории, тогда в массиве можно хранить только имя файла, и составлять путь из известной директории и имени файла...
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Chang [?]
Нужно определить число ядер на проце и запустить нужный исполнительный файл, не нужные файлы удалить за ненадобностью.
еще раз - смысл программы?
зачем определять число ядер? что за экзешники, для которых актуально число ядер?
установщик через FileInstall? если да, то не нужно копировать файлы, чтобы потом их не удалять
если экзешники это тоже скрипты autoit, то проще свести все в один код и не нужно ничего запуска и удалять.
принцип работы установщика?
возможно это еще не все вопросы.

ты понимаешь к чему я веду?
чтобы написать что-то не топорное, нужно продумать реализацию, а потом уже рисовать в редакторе.
тебе сейчас оптимизируют кусок кода, а в итоге окажется, что нужно было делать не так.
если ты хочешь получить готовый код, то нужно подробнее описывать "что-куда-и откуда", как ты это себе представляешь в деталях

ты пишешь "универсальный" установщик, но при этом не понимаешь значения простых строк в коде.
а лично я не понимаю, зачем инсталятору нужно знать сколько ядер у процессора? это инсталятор, а не профессиональный графический редактор, навороченная игруха или "кадовская" программа
 
Автор
C

Chang

Новичок
Сообщения
45
Репутация
0
joiner, майнер. В зависимости он производительности проца запускать нужный экзешник, который так же написан в autoit.

Я устал при установке каждый раз проверять тех. характеристики машины, чтобы заставить все работать без тормозов системы. Хочу автоматизировать процесс подбора нужного конфига.

ты пишешь "универсальный" установщик, но при этом не понимаешь значения простых строк в коде.
Я ни разу не программист, но методом проб и ошибок пытаюсь разобраться и научиться.

ra4o, спасибо за код, работает ;)
 

sergioz

Знающий
Сообщения
39
Репутация
5
тут в принципе сокращать ничего не надо, 20 строк кода без мат. вычислений - тормозить нечему.

это если бы код на 1000+ строк был с матаном то да, можно заморочиться
тут смысла нет, разницы даже на замерах вы не обнаружите, а не то что "на глаз"
 
Верх