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