Что нового

Сравнение скорости Autoit Vs VB 2008 .Net

sims

Осваивающий
Сообщения
184
Репутация
24
AZJIO [?]
Только пока что те кто хвалится обычно ничего не умеют как только хвалится, написать три строчки цикл и сравнить, показывая якобы свою крутость и знания.
Ваше заявление вообще не в тему.
Посмотрите на название темы. Что видите?
Сравнение скорости
А для сравнения скорости обычно используют не сложные коды, по возможности не использующие функции ОС, для большей чистоты эксперимента.
Сравниваются не крутость и знания программиста, а скорость выполнения программы.


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


Так что ваш выбор, складывать циферки в терминале/консоли или писать софт.
Еще раз повторю, тема о сравнении скорости. Для написания софта нужно выбрать подходящий ЯП, в т. ч. по скорости выполнения программы. Если был выбран медленный ЯП и в процессе разработки выяснилось что нужна большая скорость, то придется либо писать части программы на других ЯП, либо же, переписывать полностью на другой более быстрый ЯП. Поэтому нужно сразу выбрать подходящий, в т. ч. сравнить скорость работы кода нескольких ЯП.
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
Выложи софт сначала, который ты написал на Си или ещё на чём нибудь, тогда поймёшь цену этой скорости.
Абсолютно верно.

Здесь самый главный ресурс - время (проектировка+разработка+отладка). Софт на Си будет работать быстрее, это конечно, но время, занятое на его разработку будет в разы больше, чем время занятое на разработку в AutoIT. Так вот и получается, что пусть например tc - время разработки на Си, а ta - время разработки на AutoIT.

В силу легкости освоения, легкости отладки и прочих факторов получаем, что ta<tc. Так же пусть TpC - время выпуска в продакшн проекта на Си, а TpA - AutoIT. Понятно, что TpA, например, полностью зависит от ta (то же самое с TpC & tc). Время исполнения (читай скорость)? Пусть так и назовем: toe (time of execution). Так вот получается, да и логически правильно, что toeСи < toeAi, НО, так как TpA < TpC, то и время начала исполнения в Ai меньше чем в Си, а соответственно и результат исполнения обозначится раньше. Я не говорю о каких-то там околонаучных вычислениях, я говорю о повседневных задачах. То же голое, пустое окно на WinAPI (на Си) будет писаться гораздо дольше, чем на AutoIT (в принципе можно расписать так же сложно, но для чего? ведь уже все сделали за нас!). Ну вот, для сравненния:

Код:
#include <windows.h>

// Дескриптор главного окна
HWND MainWindowHandle = 0; 

// Функция для создания и отображения окна
bool InitWindowsApp(HINSTANCE instanceHandle, int show); 

// Функция обработки сообщений приложения
int  Run();               
          
// Функция обработки сообщений главного окна
LRESULT CALLBACK WndProc(HWND hWnd,
                         UINT msg,
                         WPARAM wParam,
                         LPARAM lParam);

// Входная функция - эквивалент main() в Windows
int WINAPI WinMain(HINSTANCE hInstance,  
                   HINSTANCE hPrevInstance, 
                   PSTR      pCmdLine, 
                   int       nShowCmd)
{
    // Создание и отображение окна
    // В случае неудачи выводим сообщение об ошибке и выходим из программы
    if(!InitWindowsApp(hInstance, nShowCmd)) 
    {
        MessageBox(0, L"Init - FailedL", L"ErrorL", MB_OK);
        return 0;
    }

    // Вызываем функцию обработки сообщений
    return Run();
}

bool InitWindowsApp(HINSTANCE instanceHandle, int show)
{
    // Создание класса окна
    WNDCLASS wc; 

    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = instanceHandle;
    wc.hIcon         = LoadIcon(0, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(0, IDC_ARROW);
    wc.hbrBackground = 
    static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
    wc.lpszMenuName  = 0;
    wc.lpszClassName = L"HelloL";

    // Регистрация класса окна
    // В случае неудачи выводим сообщение об ошибке и возвращаем false
    if(!RegisterClass(&wc)) 
    {
        MessageBox(0, L"RegisterClass - FailedL", 0, 0);
        return false;
    }

    // Создаем окно
    MainWindowHandle = CreateWindow(
                           L"HelloL",
                           L"HelloL",
                           WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT, 
                           CW_USEDEFAULT,
                           CW_USEDEFAULT,
                           CW_USEDEFAULT,
                           0,
                           0, 
                           instanceHandle,
                           0);
    
    // Если окно не было создано, выводим сообщени об ошибке и возвращаем false
    if(MainWindowHandle == 0)
    {
        MessageBox(0, L"CreateWindow - FailedL", 0, 0);
        return false;
    }

    // Отображаем созданное окно
    ShowWindow(MainWindowHandle, show);
    UpdateWindow(MainWindowHandle);

    // Возвращаем true
    return true;
}

int Run()
{
    MSG msg;
    ZeroMemory(&msg, sizeof(MSG));

    // Обработка входящих сообщений в цикле
    // GetMessage будет возвращать истину до тех пор, пока не будет получено сообщение WM_QUIT
    while(GetMessage(&msg, 0, 0, 0) )
    {
        // Транслируем сообщение и посылаем его функции обработке сообщений окна
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND   windowHandle,
                         UINT   msg,     
                         WPARAM wParam,
                         LPARAM lParam)
{
    // Обработка сообщений
    switch( msg )
    {
        // При щелчке ЛКМ, отображаем сообщение
        case WM_LBUTTONDOWN:
            MessageBox(0, L"Hello, WorldL", L"HelloL", MB_OK);
            return 0;
            
        // При нажатии Escape, уничтожаем главное окно программы
        case WM_KEYDOWN:
            if( wParam == VK_ESCAPE )
                DestroyWindow(MainWindowHandle);
            return 0;

        // При уничтожении окна, отправить сообщение о выходе для прерывания обработки сообщений
        case WM_DESTROY: 
            PostQuitMessage(0); 
            return 0;
    }

    // Обработка сообщений по умолчанию
    return DefWindowProc(windowHandle,
                           msg,
                           wParam,
                           lParam);
}
 

sims

Осваивающий
Сообщения
184
Репутация
24
oesoes [?]
Софт на Си будет работать быстрее, это конечно, но время, занятое на его разработку будет в разы больше,
Зачем делать упор только на Си? Существует много других языков, хотя бы упоминавшиеся в этой теме PureBasic, FreeBasic и Дельфи. Разработка с их использованием будет быстрее чем на Си. Я много раз писал что язык подбирают под задачу и если ее проще и быстрее решить на том же Дельфи, то зачем использовать Си?

В силу легкости освоения, легкости отладки
Что не заметил отладчика в автоит.

То же голое, пустое окно на WinAPI (на Си) будет писаться гораздо дольше, чем на AutoIT
Тогда пишите программу в Дельфи где окно создано по умолчанию.
Ну или на PureBasic, где сложность создания окна и контролов примерно такая же как на Автоит.
Код:
OpenWindow(0, 0, 0, 150, 50, "Демо", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered) 
TextGadget(0, 30, 16, 100, 16,"Привет мир", #PB_Text_Center)
Repeat
   Event = WaitWindowEvent() 
Until Event = #PB_Event_CloseWindow
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
Зачем делать упор только на Си? Существует много других языков, хотя бы упоминавшиеся в этой теме PureBasic, FreeBasic и Дельфи. Разработка с их использованием будет быстрее чем на Си. Я много раз писал что язык подбирают под задачу и если ее проще и быстрее решить на том же Дельфи, то зачем использовать Си?
Ну просто, для примера, тем более, что быстрее Си только ассемблер. Да и кто-то выше по моему про него говорил, не стал ничего менять.

Что не заметил отладчика в автоит.
Для отладки - не обязательно держать "отладчик", так же как и для взлома - не обязательно таскать "лом". Есть отладчик оказывается, есть и трассировщик. Так и называется: AutoIt Debugger.

Тогда пишите программу в Дельфи где окно создано по умолчанию.
Ну не, по умолчанию и просто так только кошки родятся. Пока реально дойдет до рисования окна исполнится куча методов сокрытых в недрах VCL - инкапсуляция. C PureBasic конечно никогда не работал, думаю, что если эта его нативная функция OpenWindow ни что иное как те же вызовы CreateWindow() и прочее... Просто когда я говорил про это все, я имел в виду легкость и быстроту понимания. Если бы у Си был доступ к MFC то окна бы там создавались тоже, как вы выразились, "по умолчанию".


Добавлено:
Сообщение автоматически объединено:

C PureBasic конечно никогда не работал, думаю, что если эта его нативная функция OpenWindow ни что иное как те же вызовы CreateWindow() и прочее...
Что и требовалось...
BdLYeWmJNbQvFBQq2Vsojip-dWLn9qhhTcqW3j031smktEJzmmKaCbugPmdK13VcyENp_OtH2oKkuCoeNe-b9A==

Так что, что там, что там, все будет одним и тем же, но время на это одно и то затратится разное кол-во.
 

sims

Осваивающий
Сообщения
184
Репутация
24
oesoes [?]
Пока реально дойдет до рисования окна исполнится куча методов сокрытых в недрах VCL - инкапсуляция.
Главная задача выполнена - окно создано.


C PureBasic конечно никогда не работал, думаю, что если эта его нативная функция OpenWindow ни что иное как те же вызовы CreateWindow() и прочее...
Разве в автоит функция GUICreate() не вызывает winapi CreateWindow()?
Но с функцией OpenWindow из PureBasic несколько сложнее. Функция кроссплатформенная и в винде она вызывает CreateWindow(), а вот в линукс вызывает уже функции из GTK2 или GTK3 (в зависимости от конфигурации проекта). В макос вызывает функцию из Cocoa.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Тут ещё действенный критерий развития - шаг вложения и шаг получения, которые должны чередоваться. И каждый этап получения подталкивает к шагу вложения. Если человек только вкладывает и ничего не получает, то желание затухает. Если хватает ума сразу взяться за сложное с намётками на будущее, то кто против. А можно через autoit прийти к более сложному, конечно, если захочется, если не будет хватать заявленных операций/механизмов.


sims [?]
Еще раз повторю, тема о сравнении скорости. Для написания софта нужно выбрать подходящий ЯП
Как будто взял так ага ща буду писать на Си, а это буду писать на Python, а это пожалуй напишу на PHP... Как будто так взял и выбрал на чём буду писать эту софтину... А 4 года кто будет изучать язык? Пушкин что-ли?

Я бы сказал это не критерий сравнивать языки таким методом, вызовом объектов. Даже два почти одинаковых языка могут выигрывать в одних функциях и проигрывать в других. А что если у языка имеется только функционал, предложенный в тесте, а у другого имеется ещё и другие функции и он расширяем плагами. И что, если первый выйграет тест значит переходим на него циклы создавать для запуска объектов? В Windows есть параметр 400 миллисекунд, который специально делает отображение окошек и менюшек не слишком быстрым. Так за это время я могу обсчитать окно по тому где появится, что показать, забить настройки по умолчанию в поля и это будет быстрее чем 400 миллисекунд. так что запас остается ещё большой. А перейдёшь на Си и будешь пугать пользователя быстро появляющимися окнами.

На счёт PureBasic он же платный. Пока играешься в него не обращаешь внимания, а когда захочешь что-то сделать на продажу, нужно быть готовым купить его до выпуска своей коммерческой программы, если конечно не хочешь как 15-летний мальчишка оправдываться.
 

sims

Осваивающий
Сообщения
184
Репутация
24
AZJIO [?]
Как будто так взял и выбрал на чём буду писать эту софтину... А 4 года кто будет изучать язык? Пушкин что-ли?
Если учить лень а софтину хочется - заказывайте ее разработку у фрилансеров.


Я бы сказал это не критерий сравнивать языки таким методом, вызовом объектов. Даже два почти одинаковых языка могут выигрывать в одних функциях и проигрывать в других.
Почти любой компилируемый ЯП обойдет по скорости автоит на большинстве задач - это факт!
За примером далеко ходить не надо. http://autoit-script.ru/index.php?topic=16105.msg99566#msg99566
Тот код что я выложил, генерирует случайные числа и пишет их в файл со скоростью 120 МБ/с и при этом загрузка процессора около 10%. Если предположить что скорость записи в файл настолько большая что ею можно пренебречь, то при полной загрузке процессора, скорость составит 1200 МБ/с (1.2 ГБ/с). Сможете достичь таких же результатов на автоит?


На счёт PureBasic он же платный. Пока играешься в него не обращаешь внимания, а когда захочешь что-то сделать на продажу, нужно быть готовым купить его до выпуска своей коммерческой программы
Это мало кого смущает (по крайней мере в нашей стране). Извините за нескромный вопрос. У вас винда и остальные платные программы купленные или?
Но если смущает, то, скажу вам по секрету, на фрилансе стоимость лицензии PureBasic (79 евро) окупается парой проектов. И мою лицензию, фриланс давно окупил и сейчас получаю чистую прибыль.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
joiner
Не совсем по теме, однако:
Сравнивал насколько чтение пары одномерных массивов быстрее, чем одного двумерного.
Код:
Local $aTestX[3], $aTestY[3], $iRead, $aTest[2][2]
; ---

Local $iTimer = TimerInit()
For $i = 1 To 99999 Step 1
	$aTestX[0] = 55
	$aTestX[1] = 56
	$aTestY[0] = 66
	$aTestY[1] = 67
	; -
	$iRead = $aTestX[0]
	$iRead = $aTestX[1]
	$iRead = $aTestY[0]
	$iRead = $aTestY[1]
Next
ConsoleWrite( TimerDiff( $iTimer ) & @LF)

Local $iTimer = TimerInit()
For $i = 1 To 99999 Step 1
	$aTest[0][0] = 55
	$aTest[0][1] = 56
	$aTest[1][0] = 66
	$aTest[1][1] = 67
	; -
	$iRead = $aTest[0][0]
	$iRead = $aTest[0][1]
	$iRead = $aTest[0][0]
	$iRead = $aTest[0][1]
Next
ConsoleWrite( TimerDiff( $iTimer ) & @LF)

Код:
199.808365048186
1385.58041350949

Вроде все нормально, а теперь делаем так:
Код:
Local $aTestX[3], $aTestY[3], $iRead, $aTest[2][2]
; ---

Local $iTimer = TimerInit()
For $i = 1 To 99999 Step 1
	$aTestX[0] = 55
	$aTestX[1] = 56
	$aTestX[2] = 57
	$aTestY[0] = 66
	$aTestY[1] = 67
	$aTestY[2] = 68
	; -
	$iRead = $aTestX[0]
	$iRead = $aTestX[1]
	$iRead = $aTestX[2]
	$iRead = $aTestY[0]
	$iRead = $aTestY[1]
	$iRead = $aTestY[2]
Next
ConsoleWrite( TimerDiff( $iTimer ) & @LF)

Local $iTimer = TimerInit()
For $i = 1 To 99999 Step 1
	$aTest[0][0] = 55
	$aTest[0][1] = 56
	$aTest[1][0] = 66
	$aTest[1][1] = 67
	; -
	$iRead = $aTest[0][0]
	$iRead = $aTest[0][1]
	$iRead = $aTest[0][0]
	$iRead = $aTest[0][1]
Next
ConsoleWrite( TimerDiff( $iTimer ) & @LF)

Код:
283.849294610739
242.914472460907
И о чудо, двумерный массив стал читаться в несколько раз быстрее(относительного прошлого раза)!

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

P.S. Если не затруднит - проверьте на более новых версиях AutoIt ( относительно моей версии ).
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
sims
Тот код что я выложил, генерирует случайные числа и пишет их в файл со скоростью 120 МБ/с и при этом загрузка процессора около 10%.
Почти все программы, что я написал на них скорость вообще не влияет. Большинство задействованного функционала ограничивается только сложностью написания алгоритма, то есть нехватка ума. Слабое звено голова, а не процессор. Если пойти по решению скорости, то затраченное время увеличится в разы, а выйгрыша 0. Я иду по решению слабого звена, а не увеличения параметра, который погоды не делает.

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

Это мало кого смущает (по крайней мере в нашей стране). Извините за нескромный вопрос. У вас винда и остальные платные программы купленные или?
Есть ещё критерий, вас трогают или вас не трогают. Пока вас не трогают (особенно если вы не зарабатываете), всем ровно, потому что вы можете легко отказаться. Когда зарабатываете, тут есть тоже разный пути, либо вы честный и требуете к себе честности, либо вы не напрягаетесь с этим и в отношении вас особо никто не напрягается.

Но если смущает, то, скажу вам по секрету, на фрилансе стоимость лицензии PureBasic (79 евро) окупается парой проектов. И мою лицензию, фриланс давно окупил и сейчас получаю чистую прибыль.
Да мне по секрету не надо это говорить, я сам это говорил пару лет назад кому-то. Цена Windows меньше зароботной платы, а писать её за всю жизнь не напишешь, это яркий пример тому, что в бизнесе важный критерий не бесплатность, а соотношение при котором можно заработать на софтину и потом она в течении жизни в 100 раз больше будет приностиь прибыль чем человеку пытающемуся держаться идеологии обязательно бесплатно. Но попробуйте взвесить ещё критерий, некоторые вещи дошли не в тот момент жизни когда было много денег, а когда припёрло, и зароботка нет, и тут бюджет состоит не только из одного компьютера. Так что на словах красиво а на деле каждый поступает в зависимости от своей ситуации. Могу сказать что у меня на Windows сейчас нет денег, поэтому я перешёл на Linux. И я понимаю, что мне легче купить Windows, но я исхожу из реал-политикс, а не из виртуального либерализма, как то-так.

firex
Я тоже говорил не раз, что правильно построенный алгоритм может выжать 1000 кратный прирост, а с больной головой можно и на Си сделать медленнее чем в autoit.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
AZJIO [?]
firexЯ тоже говорил не раз, что правильно построенный алгоритм может выжать 1000 кратный прирост, а с больной головой можно и на Си сделать медленнее чем в autoit.
Сам множество раз сталкивался с подобными "Индусскими"-проектами, почти во всех случаях мне удавалось написать более быстрый вариант на AutoIt ( и даже с меньшей нагрузкой на систему ).

Главное - продуманный алгоритм с рациональным использованием ресурсов ( включая сам AutoIt ).
Такие вот пироги :smile:
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Код:
#include "stdafx.h"
#include <iostream>
#include <time.h>
#include "process.h"
#include "windows.h"
int _tmain(int argc, _TCHAR* argv[])
{
	int t1 = GetTickCount();
	int  *test = new int[1000000];
	for (int i = 0; i < 1000000; i++){
		test[i] = 200;
	}

	int t2 = GetTickCount();
	//std::cout << test[100000] << '\n';
	std::cout << t1 << '\n';

	std::cout << "---------" << '\n';
	std::cout << t2 << '\n';
	int t = t2 - t1;
	std::cout << "Time: " << t  << '\n'; 
	std::cin.get();
	return 0;
}
Код на C++
Время исполнения мене одной милисекунды
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
firex [?]
P.S. Если не затруднит - проверьте на более новых версиях AutoIt ( относительно моей версии ).
последняя версия языка (не бета)
первый код:
448.821017358844
649.581742594348

второй код
699.877726151042
670.204187222484

разница видна ? :smile:
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
oesoes
#include "stdafx.h" предскомплеированый заголовок
#include <time.h> для работы с временем
#include "process.h" - а это тут не нужно ;D
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
Со временем не работаешь ) прототип GetTickCount() в windows.h лежит... А stdafx.h только для больших проектов имеет смысл. А ещё смысл имеет его в "Forced Included File" включить один раз и навсегда... Хотя не знаю, с какой ide работаешь... ну это так, просто на будущее ;)
 

sims

Осваивающий
Сообщения
184
Репутация
24
winstan [?]
Время исполнения мене одной милисекунды
Сколько у вас ноликов после единицы в цикле? А сколько в оригинальном коде в первом сообщении темы? Специально занизили? Увеличьте значение счетчика до 100 миллионов (100000000) и посмотрите какой будет результат.

Протестировал скорость выполнения кода C++ (MinGW 4.7.2), PureBasic 5.30 и VB.NET 2008, со 100 миллионами итераций цикла.
Коды.
Код:
#include <iostream>
#include "windows.h"
int main(int argc, char** argv) //int _tmain(int argc, _TCHAR* argv[])
{
	int  *test = new int[100000000];
	int t1 = GetTickCount();
	for (int i = 0; i < 100000000; i++){
		test[i] = 200;
	}

	int t2 = GetTickCount();
	//std::cout << test[100000] << '\n';
	std::cout << t1 << '\n';

	std::cout << "---------" << '\n';
	std::cout << t2 << '\n';
	int t = t2 - t1;
	std::cout << "Time: " << t  << '\n'; 
	std::cin.get();
	return 0;
}
Код:
DisableDebugger
#Count = 100000000
Dim Test.l(#Count)
N = ElapsedMilliseconds()
For i = 1 To #Count
  Test(i) = 200
Next
MessageRequester("", Str(ElapsedMilliseconds() - N))
Код:
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim Test(100000000) As Integer
        Dim N As DateTime = Now
        For i As Integer = 1 To 100000000
            Test(i) = 200
        Next
        MsgBox((Now - N).TotalMilliseconds.ToString)
    End Sub
Результаты таковы.
C++ - 390 мс.
PureBasic - 392 мс.
VB.NET - 420 мс.
Результаты почти одинаковые.
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
Все это не то. Вы тут не скорость языка измеряете, а скорость доступа к памяти, если уж на то пошло... мм, не знаю, вычисляйте хотя бы факториал хотя бы пяти тысяч... и в нескольких проходах, не по одному разу... Ох и большие ж цифры получатся :laugh:
 
Верх