summaryrefslogtreecommitdiffstats
path: root/www/footprint.html
blob: e06a88bbe9b786bba69433ffa67442e227b9fea7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
<!DOCTYPE html>
<html><head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link href="sqlite.css" rel="stylesheet">
<title>SQLite Library Footprint</title>
<!-- path= -->
</head>
<body>
<div class=nosearch>
<a href="index.html">
<img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0">
</a>
<div><!-- IE hack to prevent disappearing logo --></div>
<div class="tagline desktoponly">
Small. Fast. Reliable.<br>Choose any three.
</div>
<div class="menu mainmenu">
<ul>
<li><a href="index.html">Home</a>
<li class='mobileonly'><a href="javascript:void(0)" onclick='toggle_div("submenu")'>Menu</a>
<li class='wideonly'><a href='about.html'>About</a>
<li class='desktoponly'><a href="docs.html">Documentation</a>
<li class='desktoponly'><a href="download.html">Download</a>
<li class='wideonly'><a href='copyright.html'>License</a>
<li class='desktoponly'><a href="support.html">Support</a>
<li class='desktoponly'><a href="prosupport.html">Purchase</a>
<li class='search' id='search_menubutton'>
<a href="javascript:void(0)" onclick='toggle_search()'>Search</a>
</ul>
</div>
<div class="menu submenu" id="submenu">
<ul>
<li><a href='about.html'>About</a>
<li><a href='docs.html'>Documentation</a>
<li><a href='download.html'>Download</a>
<li><a href='support.html'>Support</a>
<li><a href='prosupport.html'>Purchase</a>
</ul>
</div>
<div class="searchmenu" id="searchmenu">
<form method="GET" action="search">
<select name="s" id="searchtype">
<option value="d">Search Documentation</option>
<option value="c">Search Changelog</option>
</select>
<input type="text" name="q" id="searchbox" value="">
<input type="submit" value="Go">
</form>
</div>
</div>
<script>
function toggle_div(nm) {
var w = document.getElementById(nm);
if( w.style.display=="block" ){
w.style.display = "none";
}else{
w.style.display = "block";
}
}
function toggle_search() {
var w = document.getElementById("searchmenu");
if( w.style.display=="block" ){
w.style.display = "none";
} else {
w.style.display = "block";
setTimeout(function(){
document.getElementById("searchbox").focus()
}, 30);
}
}
function div_off(nm){document.getElementById(nm).style.display="none";}
window.onbeforeunload = function(e){div_off("submenu");}
/* Disable the Search feature if we are not operating from CGI, since */
/* Search is accomplished using CGI and will not work without it. */
if( !location.origin || !location.origin.match || !location.origin.match(/http/) ){
document.getElementById("search_menubutton").style.display = "none";
}
/* Used by the Hide/Show button beside syntax diagrams, to toggle the */
function hideorshow(btn,obj){
var x = document.getElementById(obj);
var b = document.getElementById(btn);
if( x.style.display!='none' ){
x.style.display = 'none';
b.innerHTML='show';
}else{
x.style.display = '';
b.innerHTML='hide';
}
return false;
}
var antiRobot = 0;
function antiRobotGo(){
if( antiRobot!=3 ) return;
antiRobot = 7;
var j = document.getElementById("mtimelink");
if(j && j.hasAttribute("data-href")) j.href=j.getAttribute("data-href");
}
function antiRobotDefense(){
document.body.onmousedown=function(){
antiRobot |= 2;
antiRobotGo();
document.body.onmousedown=null;
}
document.body.onmousemove=function(){
antiRobot |= 2;
antiRobotGo();
document.body.onmousemove=null;
}
setTimeout(function(){
antiRobot |= 1;
antiRobotGo();
}, 100)
antiRobotGo();
}
antiRobotDefense();
</script>




<h1 align="center">Size Of The SQLite Library</h1>

<p>
The code space used by the SQLite library depends on the target
platform, the compiler, and optimization settings.  These variables
also affect performance.
</p>

<p>
The chart below shows the relative size and performance for SQLite
as of 2017-10-08 for various compilers and optimization settings
as tested on Ubuntu 16.04.3 on x86_64.  General observations:

<ol>
<li><p>
The Clang/LLVM compiler is not competitive with GCC.  Clang-generated
binaries are consistently larger and slower than GCC-generated binaries.

<li><p>
Profile guided optimization (PGO) is not helpful with SQLite.  PGO results
in binaries that are about 1% larger and about 0.33% slower.

<li><p>
GCC-7 generates binaries that are smaller and faster than GCC-5, though
the difference is not that great.

<li><p>
Compiling with GCC and -Os results in a binary that is slightly less 
than 500KB in size. (Update 2018-07-07: Due to the addition of new
features such as <a href="lang_upsert.html">UPSERT</a> and <a href="windowfunctions.html">window functions</a>, the library footprint
is now slightly larger than 500KB.)

<li><p>
The only significant design decision that developers need to make is
whether to use -Os (optimize for size) or -O6 (optimize for speed).
The -O6 setting makes binaries that run about 2% or 3% faster, but which
are also 66% larger.  The performance here is measured by counting CPU
cycles using cachegrind.  I-cache misses are not considered in the
analysis.  If I-cache misses are considered, builds with -O6 might not
be any faster than builds with -Os.

<li><p>
Taking into consideration all of the above, the SQLite developers recommend
compiling SQLite using GCC-7 with the -Os optimization setting.
</ol>

<hr>
<center>
<img src='images/cc-diff.jpg'>
</center>
</hr>

<h1>Details</h1>

<ul>
<li><p>
Measurements above were conducted using SQLite version 
<a href="https://sqlite.org/src/timeline?c=5594a121bf132a98">5594a121bf132a98</a> from
2017-10-08.

<li><p>
The only SQLite compile-time option used was <a href="compile.html#enable_memsys5">-DSQLITE_ENABLE_MEMSYS5</a>.
The optional <a href="malloc.html#memsys5">memsys5</a> memory allocator is used for performance testing
because it gives results that are more repeatable than the library-supplied
malloc()/free() on Ubuntu.

<li><p>
Performance can be improved and the size reduced by
enabling <a href="compile.html#threadsafe">-DSQLITE_THREADSAFE=0</a>,
<a href="compile.html#default_memstatus">-DSQLITE_DEFAULT_MEMSTATUS=0</a>,
<a href="compile.html#default_wal_synchronous">-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1</a>,
<a href="compile.html#like_doesnt_match_blobs">-DSQLITE_LIKE_DOESNT_MATCH_BLOBS</a>,
<a href="limits.html#max_expr_depth">-DSQLITE_MAX_EXPR_DEPTH=0</a>,
<a href="compile.html#omit_decltype">-DSQLITE_OMIT_DECLTYPE</a>,
<a href="compile.html#omit_deprecated">-DSQLITE_OMIT_DEPRECATED</a>,
<a href="compile.html#omit_progress_callback">-DSQLITE_OMIT_PROGRESS_CALLBACK</a>,
<a href="compile.html#omit_shared_cache">-DSQLITE_OMIT_SHARED_CACHE</a>, and
<a href="compile.html#use_alloca">-DSQLITE_USE_ALLOCA</a>.
All these options together result in about a 3.5% performance increase and
a 3.0% size reduction.

<li><p>
Adding optional features like <a href="compile.html#enable_json1">-DSQLITE_ENABLE_JSON1</a>,
<a href="compile.html#enable_fts5">-DSQLITE_ENABLE_FTS5</a>, or <a href="compile.html#enable_rtree">-DSQLITE_ENABLE_RTREE</a> will increase the
size of the library, obviously.

<li><p>
Performance was measured using the
<a href="https://sqlite.org/src/file/test/speedtest1.c">speedtest1.c</a> utility program,
which attempts to mimic a typical workload for SQLite.  Options to
the test runs are:
<blockquote>
<tt>--shrink-memory --reprepare --stats --heap 10000000 64 --size 5</tt>
</blockquote>
Performance was measured by running speedtest1 using cachegrind and
observing the "I refs" output.
</ul>
<p align="center"><small><i>This page last modified on  <a href="https://sqlite.org/docsrc/honeypot" id="mtimelink"  data-href="https://sqlite.org/docsrc/finfo/pages/footprint.in?m=47a6a3e3fe406f4a1">2018-07-07 17:44:20</a> UTC </small></i></p>