比较不同工具箱GUI的内存使用情况


大家好! 我们的团队正在开发可与TestMace API配合使用的IDE。 在我们以前的一篇文章中,读者指出了电子应用程序极高的内存消耗。 好了,数字时代来了:)在本文中,作者估计了使用各种工具包编写的单窗口应用程序的内存消耗。 祝您阅读愉快!


找到用于创建GUI的完美工具集后,我决定测量它们占用的内存量。


实际上,我想找出对于一个包含一个空窗口的程序,哪一个需要最少的内存。 在本文中,我将讨论结果。



免责声明


本文提供有关使用各种工具,框架和库在Linux上创建GUI时程序所占用内存的信息。 所有测量都是使用Ksysguard程序在装有Ubuntu 19.04(Disco Dingo)x86_64的同一台计算机上进行的,该程序提供有关应用程序消耗的内部内存的数据。 我没有为测试专门重新安装系统。 它是在我无处不在的Ubuntu上执行的,该Ubuntu上已经安装了各种软件包,这可能会影响/扭曲结果。


对于某些工具,我什至添加了在Windows 10上获得的测量结果,这些测量值几乎无法与Linux进行比较,但是很有趣。


我想指出,我的测量没有科学价值。 使用其他初始数据,您可以获得完全不同的结果。



听起来并不容易


那么,我们需要衡量什么呢? 虚拟内存(VSZ)? 常驻内存(RSS)? 自己的RSS? 共享RSS?


简而言之,我相信在比较使用不同工具集开发的两个相同程序时,最准确的方法是使用smap来衡量进程所占用的内部内存量。 Ksysguard使用smaps显示详细的内存信息。 但是,从一开始,在我的实验中,我默认使用RAM消耗面板中的数据,直到那时我才意识到smap给出了更准确的数字。 为了确保数据的一致性,我将默认RAM面板中的信息用于列表中列出的所有工具,尽管很可能使用带有内存消耗详细描述的界面,但情况类似。


如果要更详细一点,那么……在本文中,我将没有足够的空间来学习Linux中的内存管理课程,此外,关于此主题,已经有很多有价值的材料: ELC:应用程序真正使用了多少内存?/ proc文件系统proc进程信息伪文件系统Linux内存管理概述内存管理


工具列表及其内存指示器


一句话不多。 这是我的结果:


GUI工具包自己的内存(MB)备注
xcb0.132
xlib0.156
核(rawfb)0.624不会增加Xorg占用的内存
表格0.765
WINAPI(Win10)1.00在Windows 10上
dlib1.10
SDL2(不带opengl)1.10
Gdk1.20
涡轮增压视觉1.30UI
娜娜1.40
母题1.50
Fltk1.70
姆塞吉2.04
福克斯2.20
核(x11)2.200.4 MB + 1.8 MB Xorg内存
WINAPI(葡萄酒)2.30
拼箱(定制)2.50
Gtk + 22.80
wxX113.00未准备好用于生产
丽碧4.00
拼箱(GTK)4.50
Gtk + 35.00
wxGtk36.00
Efl7.20
轻型货车9.00
朱斯10.00Projucer二进制文件,窗口不为空
引子10.00大约10 MB,缺少Linux Scapp
液晶显示器11.00
格鲁伊12.50
SFML13.20
纳诺吉下午2点
Sdl下午2点
U ++下午2点
琼脂下午3点
亲爱的ImGUI(SDL)15.30
吉利特人15.80
亲爱的ImGUI(SDL / Vulkan)16.50
单声道WinForms16.564在Windows 10上
t下午5点
超轻20.00
遐想23.50
Java秋千59.30OpenJDK的12
电子74.60
JavaFX80.00OpenJDK的12
horus_ui94.00
颤振桌面98.00upd:在发展的初期!
Boost.UI--使用wxWidgets
电子图形用户界面--如何收集? :(?
联合会--与wxWdigets相似,在Linux上使用gtk +
gi--使用gtk + 2
Minigui--组装失败
莫达--组装失败
图形界面--使用SFML
TGUI--使用SFML
铜绿--使用qt


Flutter的贪婪让我感到惊讶,因为它最初被认为是为移动设备创建GUI的框架。

UPD(感谢kirbyfan64sos ): Flutter Desktop仍处于开发的早期阶段,所有构建都在调试中。 这意味着所有探查器(如天文台)均处于活动状态,所有调试语句均已启用,并且AoT编译器已禁用。 使用发布版本仔细检查数据将很有趣。


我不会说我对Electron的表现感到震惊。


使用HorusUI,我期望大约20 MB的数字,因为它使用OpenGL和GUI的即时渲染模式。 我不明白为什么这个数字还要增加。


Swing和JavaFX Java框架也显示出有趣的结果。 两者都是无法满足的,如果您不确定哪一个适合您的新Java项目,那么选择更方便,更现代的JavaFX框架似乎是合理的,尽管您将不得不增加一些内存。 但是,如果您的记忆值得用金子来吸引,那么,当然,请选择Swing。


Qt还显示出非常有趣的数字,并且比大多数其他流行工具都更加虚幻。 值得注意的是,它占用的大部分内存是系统上安装的amdgpu驱动程序消耗的内存量。 也许是因为OpenGL缓冲区存储在本地。 使用SDL2可以看到相同的结果:不使用OpenGL的程序将消耗1.1 MB,而使用OpenGL则需要14 MB。


WxWidgets和LCL在此比较中处于有利位置。 尽管它们是GUI的其他工具的包装,但资源成本却很小。 我对将后端从Gtk +转移到Qt(从而保证与工具的独立性)的想法印象深刻。


我还将重点介绍Nuklear,这仅仅是因为在我看来,它具有非常酷的GUI立即渲染模式。 如果您不对原始X11帧缓冲区的使用感到困惑,那么单窗口应用程序将仅占用0.624 MB,这看起来非常令人印象深刻。


结论


如果您希望在这里看到任何概括性的结论,那么恐怕我会让您失望。

Source: https://habr.com/ru/post/zh-CN464327/


All Articles