一、摘要
学习QT过程,自己开发的软件在执行速度不是很流畅。在之后的研究大神们的源代码,发现了一些能够加快执行效率的方法,因此记录下来。
二、字符串
1. QStringLiteral(str) 宏
QSettings *m_settingsDatabase = new QSettings(QSettings::IniFormat, QSettings::UserScope, "Awesomeness", "Settings", this);
"Awesomeness"和"Settings"将会创建临时的QString作为参数,传递给QSettings构造函数,它会涉及到内存的分配和字符串的复制操作,这样会耗费比较大的资源。
QSettings *m_settingsDatabase = new QSettings(QSettings::IniFormat, QSettings::UserScope, QStringLiteral("Awesomeness"), QStringLiteral("Settings"), this);
通过QStringLiteral("Awesomeness")宏,可以阻止分配内存空间,编码转换和字符串复制,加快创建QString临时数据的速度。
if (label->text() == QLatin1String("系统"))
在支持QLatin1String的重载的函数中(如operator==,operator+,startWith,replace),使用QLatin1String比QStringLiteral更加有效率。
三、数据库
1. SQL CREATE INDEX
CREATE INDEX 语句用于在表中创建索引。在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
CREATE UNIQUE INDEX 索引名 on 表名 (列名)
CREATE UNIQUE INDEX active_index on active_notes (id)
通过创建索引,以便更加快速高效地查询数据。用户无法看到索引,它们只能被用来加速搜索/查询。
注:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
2. SELECT 1 FROM
EXISTS 用于检测子查询,是否存在至少一行数据。
SELECT EXISTS(SELECT 1 FROM active_notes WHERE id = %1 LIMIT 1 )
- select 1 from table 返回的每行的列值是写在select后的数
- select count(1) from table 无论count(n)的n值如何变化,返回的值总是table表的行数
- select sum(1) from table 返回临时列的和
当我们只需查询数据库中是否存在,而不需要返回行的数据时候,使用select 1 from 比 select * from 效率会高很多。这样可以减少系统开销,提高运行效率,因为这样子写的SQL语句,数据库引擎就不会去检索数据表里一条条具体的记录和每条记录里一个个具体的字段值并将它们放到内存里,而是根据查询到有多少行存在就输出多少个“1”,每个“1”代表有1行记录,同时选用数字1还因为它所占用的内存空间最小,当然用数字0的效果也一样。在不需要知道具体的记录值是什么的情况下这种写法无疑更加可取。