How can rpm -qa be so slow ?
rpm -qa is about 20 times slower than the same search in ruby, even if I enforce the search on name.
When I search a particular rpm using its name, the time is the same with
rpm -q and ruby version. In fact, I didn't find any case when the C version is faster than the ruby one !
I really can't understand how the binding code can be faster than the official C rpm software...
[root@plop tmp]# time ruby -rrpm -e 'RPM::DB.new.each{ |p| puts "#{p.name}-#{p.version}"}' > ra
0.27user 0.08system 0:00.44elapsed 82%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+7219minor)pagefaults 0swaps
[root@plop tmp] # time rpm -qa > rb
7.14user 0.07system 0:07.48elapsed 96%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+4543minor)pagefaults 0swaps
[root@plop tmp] # time ruby -rrpm -e 'RPM::DB.new.each_match(RPM::TAG_NAME,nil){ |p| puts "#{p.name}-#{p.version}"}' > rc
0.29user 0.06system 0:00.44elapsed 81%CPU (0avgtext+0avgdata 0maxresident)k
[root@plop tmp]# diff ra rb
[root@plop tmp]# diff ra rc
[root@plop tmp]#
[root@plop tmp]# time ruby -rrpm -e 'RPM::DB.new.each_match(RPM::TAG_NAME,"rpm"){ |p| puts "#{p.name}-#{p.version}"}'
rpm-4.4.1-10mdk
0.03user 0.00system 0:00.10elapsed 34%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+1319minor)pagefaults 0swaps
[root@plop tmp] # time ruby -rrpm -e 'RPM::DB.new.each_match(RPM::DBI_LABEL,"rpm"){ |p| puts "#{p.name}-#{p.version}"}'
rpm-4.4.1-10mdk
0.03user 0.00system 0:00.10elapsed 34%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+1321minor)pagefaults 0swaps
[root@plop tmp] # time rpm -q rpm
rpm-4.4.1-10mdk
0.03user 0.00system 0:00.10elapsed 36%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+1630minor)pagefaults 0swaps
[root@plop tmp]# time ruby -rrpm -e 'RPM::DB.new.each_match(RPM::TAG_BASENAMES, "/bin/sh"){ |p| puts "#{p.name}-#{p.version}"}'
bash-3.0-6mdk
0.04user 0.00system 0:00.11elapsed 42%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+2029minor)pagefaults 0swaps
[root@plop tmp] # time rpm -qf /bin/sh
bash-3.0-6mdk
0.04user 0.00system 0:00.12elapsed 42%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+2311minor)pagefaults 0swaps
[root@plop tmp]# time ruby -rrpm -e 'RPM::DB.new.each_match(RPM::TAG_NAME,"rpm"){ |p| puts p.sprintf("[%{RequireName} %{RequireFlags:depflags} %{RequireVersion}\n]")}' > ra
0.03user 0.00system 0:00.10elapsed 34%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+1288minor)pagefaults 0swaps
[root@plop tmp] # time rpm -q --requires rpm > rb
0.03user 0.00system 0:00.11elapsed 36%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+1610minor)pagefaults 0swaps
[root@plop tmp] # diff ra rb
[root@plop tmp]#
[root@plop tmp]# time ruby -rrpm -e 'RPM::DB.new.each_match(RPM::TAG_REQUIRENAME,"rpm"){ |p| puts "#{p.name}-#{p.version}"}'
basesystem-10.1-1mdk
menu-2.1.23-1mdk
cups-common-1.1.23-11mdk
rpm-python-4.4.1-10mdk
rpm-build-4.4.1-10mdk
perl-URPM-1.24-1mdk
rpmtools-5.0.21-1mdk
0.03user 0.00system 0:00.11elapsed 33%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+1431minor)pagefaults 0swaps
[root@plop tmp] # time rpm -q --whatrequires rpm
basesystem-10.1-1mdk
menu-2.1.23-1mdk
cups-common-1.1.23-11mdk
rpm-python-4.4.1-10mdk
rpm-build-4.4.1-10mdk
perl-URPM-1.24-1mdk
rpmtools-5.0.21-1mdk
0.07user 0.00system 0:00.16elapsed 48%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+1673minor)pagefaults 0swaps
I have noticed that rpm -qa is very slow on 2006 Cooker. It wasn't the case on Desktop/LX, but that is a lot of different software. But yes, rpm -qa is abnormally slow.
Laaaaaaaaaate reply, but I believe here's why:<br>[hawkeye@terror ~]$ time rpm -qa --nosignature --nodigest > tmp/rpm.rpm<br>0.75user 0.27system 0:01.09elapsed 93%CPU (0avgtext+0avgdata 0maxresident)k<br>0inputs+0outputs (0major+2845minor)pagefaults 0swaps<br>[hawkeye@terror ~]$ time ruby -rrpm -e 'RPM::DB.new.each{ |p| puts "#{p.name}-#{p.version}"}' > tmp/ruby.rpm<br>0.80user 0.30system 0:01.18elapsed 93%CPU (0avgtext+0avgdata 0maxresident)k<br>0inputs+0outputs (0major+5090minor)pagefaults 0swaps<br><br>I believe ruby doesn't verify digest nor signature by default?
Yes, it only queries the database as you can see in the simple code :) See http://fasmz.org/~pterjan/blog/?date=20051208