Thread Tk::Font::measure ist zu langsam (9 answers)
Opened by betterworld at 2005-07-24 17:03

betterworld
 2005-07-25 20:08
#44252 #44252
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Danke fuer die Antworten.

Die Erklärung mit xfs klingt einleuchtend. (Auch wenn ich keinen xfs verwende, aber trotzdem bezieht Tk jedes Mal die Font vom X-Server, wie ich gerade mit strace herausgefunden habe.) Es scheint noch etwas mehr dahinterzustecken. Gerade habe ich, angeregt durch ptks Beispiel, herausgefunden, dass es weitaus länger dauert, wenn man Helvetica groß schreibt, als wenn man es klein schreibt. Hier eine Demonstration:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use Benchmark (':all');
use Tk;
use Tk::Font;
my $mw = MainWindow->new;
my $f1 = $mw->Font(-family => 'helvetica', -size => 10 );
my $f2 = $mw->Font(-family => 'Helvetica', -size => 10 );
timethese( $_, {
'klein' => sub { $f1->measure('hallo'); },
'groß' => sub { $f2->measure('hallo'); },
}) for 400, 1000;

# Ausgabe:
Benchmark: timing 400 iterations of groß, klein...
groß: 28 wallclock secs (19.58 usr + 0.33 sys = 19.91 CPU) @ 20.09/s (n=400)
klein: 14 wallclock secs ( 7.44 usr + 0.21 sys = 7.65 CPU) @ 52.29/s (n=400)
Benchmark: timing 1000 iterations of groß, klein...
groß: 69 wallclock secs (48.47 usr + 0.65 sys = 49.12 CPU) @ 20.36/s (n=1000)
klein: 39 wallclock secs (18.70 usr + 0.49 sys = 19.19 CPU) @ 52.11/s (n=1000)


Ich hatte eigentlich gedacht, dass beim Erzeugen der Font der X-Server kontaktiert wird, und sie anschließend gecacht wird. Das wäre effizienter.

Die Idee mit der binären Suche von ptk klingt interessant. Das wird wahrscheinlich auch bessere Resultate für (kursive) Buchstaben ergeben, die über den Wortrand herausragen. Ich merk mir das mal für später.

Vielleicht werde ich zum Ausmessen der Schriften einfach andere Module (wie Font::AFM, was ich gerade bei CPAN entdeckt habe) benutzen, und nur das Zeichnen dann Tk überlassen.\n\n

<!--EDIT|betterworld|1122307788-->

View full thread Tk::Font::measure ist zu langsam