to generate an image involving about a million calls to Imager->setpixel
... almost certainly indicates a design flaw. Unless, of course, your pixels arrive at random unpredictable coordinates, to be scattered over a megapixel (or larger) canvas. Which I suspect they don't. (And even then it should be setscanline for each pixel with packed color as arg). Doco (emphasis mine):
The getscanline() and setscanline() methods can work with pixels packed into scalars. This is useful to remove the cost of creating color objects, but should only be used when performance is an issue
use strict; use warnings; use feature 'say'; use Time::HiRes 'time'; use Imager; sub get_RGB_triplet { map { int rand 256 } 0 .. 2 } { my $i = Imager-> new( xsize => 1000, ysize => 1000 ); my $t = time; for my $y ( 0 .. 999 ) { for my $x ( 0 .. 999 ) { my $c = Imager::Color-> new( get_RGB_triplet ); $i-> setpixel( x => $x, y => $y, color => $c ) } } say time - $t; } { my $i = Imager-> new( xsize => 1000, ysize => 1000 ); my $t = time; for my $y ( 0 .. 999 ) { my $packed_line = ''; for my $x ( 0 .. 999 ) { $packed_line .= pack 'C3x', get_RGB_triplet; } $i-> setscanline( y => $y, pixels => $packed_line ) } say time - $t; } __END__ 5.78085088729858 0.599802017211914
In reply to Re: Double the speed of Imager->setpixel
by Anonymous Monk
in thread Double the speed of Imager->setpixel
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |