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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2025, 19:09   #1
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,374
По умолчанию О размере кода в Lazarus

Вопрос вынес в отдельную тему, поскольку в исходной теме он может затеряться.

BDA
Цитата:
Накидал кнопки, мемо, едиты, лебелы аналогично проекту из дельфи, код просто скопировал, заменил только одну строчку:

/
Код:
/ было
MessageBox(handle, PChar('Данные записаны и файл сохранён!'), PChar('Сообщение'), MB_ICONINFORMATION);

// стало
MessageDlg('Сообщение', 'Данные записаны и файл сохранён!', mtInformation, [mbOK], 0);
Всё заработало. EXE-шник действительно тяжеловат (24 мегабайта, против 400 килобайт от дельфи; если собрать с оптимизациями, то 5 мегабайт), но при современных объемах накопителей несмертельно.
В Lazarus есть настройка на наличие отладочного кода в исполняемом файле.
Присутствие отладочного кода в исполняемом файле можно отключить, что уменьшит размер файла.

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

PS: У меня сейчас Lazarus не установлен и протестировать не могу.
Установку среды пока не планирую, но вопрос завис и "калган чешется".
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 28.02.2025, 19:41   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,855
По умолчанию

В Делфи тоже размер exe сильно зависит от версии Делфи, и чем новее, тем exe увесистее. Но, как верно сказано в цитате, сейчас на это мало кто смотрит. Условно одна фотка с телефона или один музыкальный трек больше будут весить.
Arigato вне форума Ответить с цитированием
Старый 28.02.2025, 22:46   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,374
По умолчанию

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

Например, компилятор не активно использует системные библиотеки или ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 01.03.2025, 00:34   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Сейчас обновился с Lazarus 2.2.6 на 3.8 и собрал тот же проект - вышло 25 мегабайт. Но в прошлый раз неверно собрал релизную версию (не пользуюсь Лазарусом, поэтому не разобрался). Релизная версия 3 мегабайта. Размер примерно такой же, как у современного Дельфи (например, пишут про 2 мегабайта для Delphi XE3 - https://stackoverflow.com/questions/...r-than-dephi-7). Вот интересная статья с рассуждениями о размере - https://wiki.freepascal.org/Size_Matters.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 01.03.2025, 09:04   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,374
По умолчанию

BDA, спасибо за ссылку.
Как по мне, так это хороший и конкретный в деталях обзор.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 01.03.2025, 13:04   #6
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 205
По умолчанию

Lazarus 3.6 в Linux:
сделал простейшую программу где одна форма и кнопка на ней.
Размер исполняемого файла с отладочной информацией 27,6 мегабайт,
без отладочной информации - 7,1 мегабайт.

Когда-то прграммировал на C++ Builder, помнится он делал исполняемые файлы от 3,5 мег до 5 мег.
DeepFlake вне форума Ответить с цитированием
Старый 01.03.2025, 14:05   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,855
По умолчанию

Когда-то Делфи делал exe размером то ли 120 Кб, то ли 160 Кб, точно не помню. Это с формами. Вроде это был Делфи 3. В то время мы программы сохраняли на дискеты (1.44 Мб), а потому размер был важен. Сейчас же исполняемый файл в несколько Мб вообще не проблема. Особенно если учесть, что с того времени прошло лет 30...

А почему размер все больше и больше? Да больше всяких юнитов подключается, и сами юниты больше стали за 30 лет. Хотя, конечно, в теории можно было бы оптимизировать до уровня, чтобы из exe удалять все неиспользуемые функции и методы. Видимо, так не делается компилятором.
Arigato вне форума Ответить с цитированием
Старый 01.03.2025, 17:05   #8
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 205
По умолчанию

Если программа на С++, то, конечно, всё гораздо эффективнее.
Вот программа рисует геометрические фигуры, ещё есть поток для приёма данных.
Программа на GTKmm 3 под Linux.
Размер исполняемого файла с отлад. информацией - 103,5 килобайта,
без отлад. инф. - 64,1 килобайт. (64 килобайта!)


Код:
#include <glibmm.h>

#include <gtkmm/application.h>
#include <gtkmm/window.h>
#include <gtkmm/button.h>
#include <cairomm/cairomm.h>
#include <gtkmm/widget.h>

#include <iostream>
#include <thread>
#include <cmath>
#include <chrono>
#include <mutex>

class DrawWindow ;
static void data_receiver_proc( DrawWindow* wind );

class DrawWindow 
    : public Gtk::Window
{
    public:
        explicit DrawWindow();
        virtual ~DrawWindow();

    protected:
        //Signal handlers:
        bool OnDraw( const ::Cairo::RefPtr< ::Cairo::Context >& cr ); 
        void GuiTasklet()
        {
            // здесь в контексте GUI цикла
            std::cout << __FUNCTION__ << ":" << std::endl;
            this->queue_draw();
                // перерисовать
        }

    protected:
        //Member widgets:
        Glib::Dispatcher    gui_loop;
        
    public:
        void ScheduleGuiTasklet()
        {
            this->gui_loop.emit();
        }

};

DrawWindow::DrawWindow()
{
    this->set_default_size( 600, 400 ); // w, h
    //this->set_resizable( false );
    this->set_title( "Draw!" );
    this->set_app_paintable( true );

    this->signal_draw().connect( sigc::mem_fun( *this,
              &DrawWindow::OnDraw ) );

    this->gui_loop.connect( sigc::mem_fun( *this, &DrawWindow::GuiTasklet) );

    // Sets the border width of the window.
    //this->set_border_width( 10 );
    this->show_all_children();
}

DrawWindow::~DrawWindow()
{
}

bool DrawWindow::OnDraw( const ::Cairo::RefPtr< ::Cairo::Context >& cr ) 
{
    static double clr = 0;

    std::cout << "on draw " << 
        this->get_allocated_width() << " " << this->get_allocated_height() << std::endl;
    
    cr->save();
    // по умолчанию цвет - чёрный
    // fill background in white
    // закрашиваем всю область в заданный цвет
    cr->set_source_rgb( 1.0, 1.0, 1.0 );
    cr->paint();
    cr->restore();
        // восстанавливаем настройки рисования по умолчанию 
        // (в том числе и цвет )
    
    // прямоуголник 
    cr->set_source_rgb( 0.8, 0.2, 0.2 );
    cr->set_line_width( 20.0 );    // make the line wider
    cr->rectangle( 200.0, 100.0, this->get_allocated_width()/2.0, this->get_allocated_height()/4.0 );
    cr->stroke(); // прямоуголник из линий текущего цвета, а цвет внутри как у фона
    //cr->fill(); // прямоугольник закрашенный весь текущим цветом
    
    // круг залит заданным цветом
    cr->set_line_width( 3.0 );
    cr->arc( 100, 250, this->get_allocated_width()/8.0, 0, 2*M_PI);
    clr += 0.05;
    if ( clr > 1.0 )
    {
        clr = 0;
    }
    cr->set_source_rgb( clr, clr, 0.47);
    //cr->set_source_rgb(0.86, 0.85, 0.47);
    cr->fill();   // круг залит заданным цветом
    //cr->stroke();   // окружность
    
    // линия 
    cr->set_line_width( 5.0 );
    cr->set_source_rgb( 0.1, 0.3, 0.47);
    cr->move_to( this->get_allocated_width() / 4.0, this->get_allocated_height() / 4.0);
    cr->line_to( this->get_allocated_width() * 3.0 / 4.0, this->get_allocated_height() * 3.0 / 4.0);
    cr->stroke();
    
    
    // no flicker when resizing
    // automatic double buffering
    
    return true; 
    //return false; 
}


void data_receiver_proc( DrawWindow* wind )
{
    if ( wind == nullptr )
    {
        std::cerr << __FUNCTION__ << ": null window ptr" << std::endl;
        return;
    }
    
    while ( true )
    {
        try 
        {
            std::this_thread::sleep_for( std::chrono::seconds( 1 ) );
                // here hangs when close window (in sleep_for):
                // "terminate called without an active exception"
                // "Aborted"
        }
        catch (...)
        {
            std::cerr << "!! draw app: this_thread::sleep_for hangs" << std::endl;
                // doesn't work
            throw;
        }
        
        std::cout << "data receiver thread:" << std::endl;
        
        wind->ScheduleGuiTasklet();
    }

}

//--- Main ----------------------------------------------------
int main(int argc, char *argv[])
{
    auto app = Gtk::Application::create( argc, argv,
        "ru.people.jerky.gtkmm3.drawapp");

    // creating of widgets should be after app (gtk kit) initialization
    DrawWindow     main_window;
    //main_window.set_default_size( 200, 200 );
    
    std::thread     data_receiver_thr ( data_receiver_proc, &main_window );
    data_receiver_thr.detach();
        // don't forget to detach thread object from proc.
        // if do not detach, thread object (data_receiver_thr) frees when exits
        // data_receiver_proc only. Когда главн окно закрывается, 
        // поток data_receiver_proc ещё работает и объект data_receiver_thr
        // не успевает освободиться и падает.
    
    int ret = 0;
    try
    {
        ret = app->run( main_window );
    }
    catch (...)
    {
        std::cerr << "!! draw app: some erroe occurs" << std::endl;
        ret = 1;
    }
    return ret;
}
Изображения
Тип файла: png Screenshot_2025-03-01_17-39-18.png (13.3 Кб, 13 просмотров)
DeepFlake вне форума Ответить с цитированием
Старый 01.03.2025, 17:56   #9
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,869
По умолчанию

ну да, в наш век гигагерц и терабайт трястись из-за пары лишних мегабайт в приложении.
-------
меня, если честно, тоже напрягает такое разбухание проектов...
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 01.03.2025, 19:17   #10
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,855
По умолчанию

Цитата:
Сообщение от DeepFlake Посмотреть сообщение
Вот программа рисует геометрические фигуры, ещё есть поток для приёма данных.
Это некорректное сравнение. На Делфи тоже можно ручками сделать такую программу, которая будет в окне рисовать фигуры. Она тоже будет весить менее 100 Кб, а то и того меньше. Не знаю, как в современных версиях, а на старых (вроде Делфи 6 или 7) делали программы размером в районе 16 Кб.

Разбухать начинает ровно с того момента, как мы начинаем использовать VCL. И тут вариант на C++ ни в какое сравнение не идет, так как в Делфи есть удобный визуальный конструктор форм с кучей плюшек. А на C++ вы ручками пишете. Вот именно за удобства и надо платить. А так можно в Делфи писать на WinAPI, размер exe будет очень даже компактным...
Arigato вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при максимальном размере mariya22 JavaScript, Ajax 1 18.05.2021 17:52
Печать изображений в правильном размере. Человек_Борща Общие вопросы Delphi 2 03.08.2013 10:27
разница в размере исходного и декодированного файла Kseniya111 Общие вопросы C/C++ 1 15.01.2013 19:37
Загадка о размере файла .xls Jockernsk Microsoft Office Excel 10 23.10.2010 00:58