
大家好! 我们的团队正在开发可与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内存管理概述 , 内存管理
工具列表及其内存指示器
一句话不多。 这是我的结果:

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,这看起来非常令人印象深刻。
结论
如果您希望在这里看到任何概括性的结论,那么恐怕我会让您失望。