Hallo!
Ich habe zum Spielen mit DBIx::Class ja mal ein Forum gebastelt. Mit den Testdaten hat das auch prima funktioniert, jetzt habe ich zum testen der Suchfunktion ganz viele Daten eingespielt (ca. 100.000 Posts).
Nun dauerte der Aufbau der Übersichtseite auf einmal 23 Sekunden :-s
Also habe ich angefangen, die Sache zu optimieren. Mein Testskript braucht jetzt "nur noch" 3 Sekunden. Das ist immer noch zu viel. Ich nehme mal an, dass ich den falschen Ansatz habe, eventuell kann mri da ja jemand helfen.
Hier ist mein Test:
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
#!/usr/bin/perl
use strict;
use warnings;
use Carp qw/croak/;
use Data::Dumper qw/Dumper/;
use Perl6::Say;
use Benchmark;
use FindBin qw/$Bin/;
use lib $Bin . '/..';
use Bulletinboard::Schema;
use Config::Auto;
my $t0 = Benchmark->new();
my $cfg = Config::Auto::parse($Bin.'/../config/config.pl');
my $schema = Bulletinboard::Schema->connection(
$cfg->{db}->{dsn},
$cfg->{db}->{username},
$cfg->{db}->{password},
$cfg->{db}->{attributes},
);
#$schema->storage->debug(1);
my @topic_loop = ();
my $trs = $schema->resultset('Topic')->search(
undef,
{
order_by => 'me.position ASC',
prefetch => [qw/boards/],
}
);
while( my $topic = $trs->next() ) {
say $topic->topic();
my @board_loop = ();
foreach my $board ( $topic->boards() ) {
say "\t" . $board->title();
# -- get the latest thread
my ($lastthread) = $board->threads(
undef,
{
order_by => 'date_of_creation DESC',
}
)->slice(0,1);
print "\t\t" . $lastthread->subject() . ": ";
my $lastpost = undef;
if( defined $lastthread ) {
($lastpost) = $lastthread->posts(
undef,
{
select => 'timestamp',
order_by => 'timestamp DESC',
}
)->slice(0,1);
say $lastpost->timestamp();
}else{
say "no posts";
}
}
}
my $t1 = Benchmark->new();
my $td = Benchmark::timediff($t1, $t0);
say 'benchmark_timediff: ' . timestr($td);
Der Teil, der den letzten Beitrag errechnet ist derjenige, der die ganze Zeit verbraucht. Kommentiert man ihn aus, bin ich bei 0 wallclock secs ( 0.17 usr + 0.03 sys = 0.20 CPU).
Nur, wie komme ich effizienter an den letzten Beitrag? Sollte ich den besser manuell pflegen? Also die ID des letzten Posts in einem Thread in der Thread-Tabelle mitführen und aktualisieren, wenn ein beitrag verfasst wird?
Grüße, pktm