[cairo] Very large number of lines
necko necko
opustenom at hotmail.com
Tue Aug 31 06:27:59 PDT 2010
Thanks for the email.
You were right about stroke the same line over
itself. Therefore, I made a simple
random coordinate generator that
should more closely describe the problem I'm
working on.
Note that
all the lines need to be shown in the pdf file (therefore I use
translate
which depends on min/max coordinate). The number of lines
is from
20million-350million. This is the main reason I'm striving
for speed (in processing
and in displaying).
Therefore, displaying
a PNG file would be appropriate. Please consider the code below.
The
first translate option cairo_translate (cr, -229770, 26573); leads to
execution time
of around 7min, while the second one cairo_translate
(cr, -429000, 35000); leads to
execution time of around 1min. Is it
because the invisible parts are not processed?
For my
application, everything within the bounding box (determined by the
min/max
coordinate) should be displayed.
I noted that the output
is different when stroke() every 1000th or 100000th line.
I thought
this was because of the random number generator, but I tested it several
times.
Please consider the attached PNG files. Note that with the
increase of the stroke() stride,
the picture's edge becomes more
precise. What is the reason for this?
What option should I consider
for my application?
The code that should demonstrate the problem
is shown below:
#include <cairo.h>
#include
<cairo-pdf.h>
#include <sstream>
#include
<cmath>
#include <vector>
#include
<limits.h>
#include <queue>
#include <algorithm>
#include
<numeric>
#include <iostream>
int main() {
cairo_surface_t *surface;
cairo_t *cr;
std::stringstream
myOut; int k=1;
myOut<<"pics/forGallery"<<k<<
".pdf";
unsigned int resolutionNo=4;
//surface =
cairo_pdf_surface_create(myOut.str().c_str(), 1432, 1606);
//surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1432, 1606);
//surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 1432, 1606);
surface = cairo_image_surface_create(CAIRO_FORMAT_A8, 1432, 1606);
//surface = cairo_image_surface_create(CAIRO_FORMAT_A1, 1432, 1606);
cr = cairo_create(surface);
cairo_set_line_width (cr, .5);
//cairo_translate (cr, -229770, 26573);
cairo_translate (cr,
-429000, 35000);
srand((unsigned)time(0));
double xCoordinate,
yCoordinate;
unsigned int t=0; unsigned int ITER_NO=2000000;
while(t<ITER_NO) {
xCoordinate=(rand()%230000)+200000.6;
yCoordinate=(rand()%26000)+20000.2;
cairo_move_to (cr,
xCoordinate, -yCoordinate);
xCoordinate=(rand()%230000)+200000.3;
yCoordinate=(rand()%26000)+20000.7;
cairo_line_to (cr,
xCoordinate, -yCoordinate);
if(t%100000==0 || t==ITER_NO-1) {
//if(t==ITER_NO-1) {
cairo_stroke(cr);
}
std::cout<<"Drawn so
far:"<<((double)t/(double)ITER_NO)*100<<"%"<<std::endl;
++t;
}
//cairo_stroke(cr);
//cairo_show_page(cr);
// for PDF
cairo_surface_write_to_png(surface, "pics/image.png");
// for PNG
cairo_surface_finish(surface);
cairo_surface_destroy(surface);
cairo_destroy(cr);
return
0;
}
.........................................
In addition,
any other suggestions what option to chose for displaying large number
of lines
(ITER_NO>20million in the code above) are welcome.
Thanks.
> Date: Mon, 30 Aug 2010 20:31:49 +0200
> Subject: Re: [cairo] Very large number of lines
> From: ranma42 at gmail.com
> To: opustenom at hotmail.com
> CC: cairo at cairographics.org
>
> On Mon, Aug 30, 2010 at 8:20 PM, necko necko <opustenom at hotmail.com> wrote:
> > Thank you for your email. The code I provided is just a sample. I need to
> > show
> > connections between a number of coordinates; so, in the real scenario the
> > output file
> > should display various lines.
>
> How many lines do you expect to pass through the visible area?
> Maybe a preprocessing your data to discard the invisible lines would allow
> you to get an usable pdf and/or improve the performance of rasterization.
>
> >
> > The stroke() invoked on every 1000000th line produces the pdf file
> > (otherwise, only one
> > stroke at the end will not produce the pdf file). I know this because the
> > size of the output
> > file is around 100MB (otherwise, around 400kb). Clearly, I have problems
> > displaying this
> > file.
> >
> > As the way to get around this problem was to output PNG file, with the same
> > strategy of
> > invoking stroke() on every 1000000th line. The code I sent (for PNG files)
> > spends *very*
> > long time on each stroke() invoked.
> >
> > Therefore, I wonder whether there is a way to get the png output with this
> > large number of connections.
> > I tried to use similar strategy as with pdf files, but it is very time
> > consuming.
> > Perhaps you could try to invoke the code;
>
> I did try your code. I found that (on my laptop) stroking every ~128
> lines is much faster
> for the image backend.
> Anyway you should *NOT* keep stroking the same line over itself, it is
> not a good
> benchmark (it can easily be ten times slower than what you would get
> using the real
> data).
>
> Profiling your code (when running on actual data) might give you some
> more insight
> about the real hot spot.
>
> Andrea
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cairographics.org/archives/cairo/attachments/20100831/d8ef8a9d/attachment.htm>
More information about the cairo
mailing list