473,387 Members | 1,891 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,387 software developers and data experts.

Slow printing in C#/.NET...

I C# code prints very slow as compared to a third party barcode printing
software. That software prints approximately 10 labels in 2 seconds while my
C# code prints 10 labels in 5 to 6 seconds. And this differences increases
with the increase number of labels.

The code is as follwods:
Here rdr = OleDbDataReader
Font is Times New Roman, 12pt
private void printDocument1_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
e.HasMorePages = false;

if(this.rdr.Read())
{
e.Graphics.DrawString(rdr[0].ToString(), font, Brushes.Black, 10, 20);
e.Graphics.DrawString(rdr[1].ToString(), font, Brushes.Black, 10, 40);
e.Graphics.DrawString(rdr[2].ToString(), font, Brushes.Black, 10, 60);

if( --this.labels_to_print > 0)
e.HasMorePages = true;
}
}

How can I increase printing speed? Please help.

Arif.
Nov 17 '05 #1
4 9139
Arif,

I don't see much room for improvement here. It looks like you are
disposing of resources correctly (or rather, not allocating anything that
you don't need during the printing process).

The Graphics object takes advantage of GDI+, which is very slow. This
is probably the issue. I would suspect that the third-party component is
not using GDI+. Why not just use that?

Hope this helps.
--
- Nicholas Paldino [.NET/C# MVP]
- mv*@spam.guard.caspershouse.com
"Arif" <Ar**@discussions.microsoft.com> wrote in message
news:F2**********************************@microsof t.com...
I C# code prints very slow as compared to a third party barcode printing
software. That software prints approximately 10 labels in 2 seconds while
my
C# code prints 10 labels in 5 to 6 seconds. And this differences increases
with the increase number of labels.

The code is as follwods:
Here rdr = OleDbDataReader
Font is Times New Roman, 12pt
private void printDocument1_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
e.HasMorePages = false;

if(this.rdr.Read())
{
e.Graphics.DrawString(rdr[0].ToString(), font, Brushes.Black, 10, 20);
e.Graphics.DrawString(rdr[1].ToString(), font, Brushes.Black, 10, 40);
e.Graphics.DrawString(rdr[2].ToString(), font, Brushes.Black, 10, 60);

if( --this.labels_to_print > 0)
e.HasMorePages = true;
}
}

How can I increase printing speed? Please help.

Arif.

Nov 17 '05 #2
Another issue is that you're actually reading directly out of the database
while printing, and using OleDb (Access?) mind you -- not a good performer.

Could you read the data into an array first, then call the Print() and just
iterate through the array inside the PrintPage event? You could then
isolate the performance problems between reading from the db and how long
the GDI+ calls and spooling is actually taking. I would put good money that
your db access is slowing you down MUCH more than GDI+.

I have an app that prints Legal (8.5x14) paychecks and I can spool about 10
checks/pages per second on a 2.4Ghz/512MB laptop. They have at least 100
DrawString()s, probably a dozen fonts (including a custom MICR font -
similar to a barcode), at least 30-40 DrawLine()s, and 4 DrawImage()s for
signature files and logos on the checks. Everything is read into memory
before I call the Print() method though.

Craig
"Arif" <Ar**@discussions.microsoft.com> wrote in message
news:F2**********************************@microsof t.com...
I C# code prints very slow as compared to a third party barcode printing
software. That software prints approximately 10 labels in 2 seconds while
my
C# code prints 10 labels in 5 to 6 seconds. And this differences increases
with the increase number of labels.

The code is as follwods:
Here rdr = OleDbDataReader
Font is Times New Roman, 12pt
private void printDocument1_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
e.HasMorePages = false;

if(this.rdr.Read())
{
e.Graphics.DrawString(rdr[0].ToString(), font, Brushes.Black, 10, 20);
e.Graphics.DrawString(rdr[1].ToString(), font, Brushes.Black, 10, 40);
e.Graphics.DrawString(rdr[2].ToString(), font, Brushes.Black, 10, 60);

if( --this.labels_to_print > 0)
e.HasMorePages = true;
}
}

How can I increase printing speed? Please help.

Arif.

Nov 17 '05 #3
I would recommend that you get your hands on a profiler (comes with
VS2005, for VS2003 you can use CompuWare's DevPartner Community
Edition:

http://www.compuware.com/products/de...rtner&sf=1&p=0

Profile your application, figure out where it's spending all its time,
and then figure out how to optimize that.

Nov 17 '05 #4
Now i am using the simplest code that reads the data from an array rather
than from OleDbDatareader object, as follows:

private void printDocument1_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
e.Graphics.DrawString(this.data_ary[this.labels_to_print-1, 0], font,
Brushes.Black, 10, 20);
e.Graphics.DrawString(this.data_ary[this.labels_to_print-1, 1], font,
Brushes.Black, 10, 40);
e.Graphics.DrawString(this.data_ary[this.labels_to_print-1, 2], font,
Brushes.Black, 10, 60);

if( --this.labels_to_print > 0)
e.HasMorePages = true;
else
e.HasMorePages = false;

}

But I am seeing the same down printing speed as was in the case using
OleDBDataReader instead of an array.

I also notice that when I turn off the printer,click to print then 64
pages/labels are spooled very fast. But if the printer is ON then this
spooling is comparatively slow.

I think that the printer is printing labels perhaps as a separate print job
for each page because there is a step/0.5 second delay between two labels
printing. But the third party software prints contineously and very fast.
when I used the following code to print 64 labels separately, I see the same
printing style/speed as was when printing 64 labels in on printing job.

some_methos()
{
for(int i=0; i < this.labels_to_print; i++) //printing 64 labels as separate
print job.
this.printDocument1.Print();
}

private void printDocument1_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
e.HasMorePages = false;

e.Graphics.DrawString(this.data_ary[this.labels_to_print-1, 0], font,
Brushes.Black, 10, 20);
e.Graphics.DrawString(this.data_ary[this.labels_to_print-1, 1], font,
Brushes.Black, 10, 40);
e.Graphics.DrawString(this.data_ary[this.labels_to_print-1, 2], font,
Brushes.Black, 10, 60);
}

I think that may be there some settings for printer that I should take care
in C# code.

Any new idea, please share.

Arif.
"Craig Scheets" wrote:
Another issue is that you're actually reading directly out of the database
while printing, and using OleDb (Access?) mind you -- not a good performer.

Could you read the data into an array first, then call the Print() and just
iterate through the array inside the PrintPage event? You could then
isolate the performance problems between reading from the db and how long
the GDI+ calls and spooling is actually taking. I would put good money that
your db access is slowing you down MUCH more than GDI+.

I have an app that prints Legal (8.5x14) paychecks and I can spool about 10
checks/pages per second on a 2.4Ghz/512MB laptop. They have at least 100
DrawString()s, probably a dozen fonts (including a custom MICR font -
similar to a barcode), at least 30-40 DrawLine()s, and 4 DrawImage()s for
signature files and logos on the checks. Everything is read into memory
before I call the Print() method though.

Craig
"Arif" <Ar**@discussions.microsoft.com> wrote in message
news:F2**********************************@microsof t.com...
I C# code prints very slow as compared to a third party barcode printing
software. That software prints approximately 10 labels in 2 seconds while
my
C# code prints 10 labels in 5 to 6 seconds. And this differences increases
with the increase number of labels.

The code is as follwods:
Here rdr = OleDbDataReader
Font is Times New Roman, 12pt
private void printDocument1_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
e.HasMorePages = false;

if(this.rdr.Read())
{
e.Graphics.DrawString(rdr[0].ToString(), font, Brushes.Black, 10, 20);
e.Graphics.DrawString(rdr[1].ToString(), font, Brushes.Black, 10, 40);
e.Graphics.DrawString(rdr[2].ToString(), font, Brushes.Black, 10, 60);

if( --this.labels_to_print > 0)
e.HasMorePages = true;
}
}

How can I increase printing speed? Please help.

Arif.


Nov 17 '05 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

16
by: Jason | last post by:
Hey, I'm an experience programmer but new to Python. I'm doing a simple implementation of a field morphing techinique due to Beier and Neely (1992) and I have the simple case working in Python...
0
by: lubprog | last post by:
hi, I am printing jpg files which are on a disk. The file name is selected from a database and the file is located on the disk and then printed. I am able to print the file but it takes a long...
1
by: chankey | last post by:
I have code that is able to print using the PrintDocument class, PrintPage event and the Graphics.DrawString method. It is on the slow side though. Does anyone have an ideas on how to speed up...
0
by: The ants are driving me crazy | last post by:
Printing in .net 2003 using PrintDocument class seems to be slow. Has anyone else found this to be true? And found a work-around?
3
by: Toral Shah | last post by:
hi i have made a data entry program and want to print my report in dot matrix printer. but the printing speed is really slow. but when i print my dos based reports the output is really fast. do i...
33
by: nw | last post by:
Hi all, I'm constantly confronted with the following two techniques, which I believe often produce less readable code, but I am told are faster therefore better. Can anyone help me out with...
0
by: Kerem Gümrükcü | last post by:
Hi, i use the code from this code sample on MSDN: for printing a 5 and sometimes 70 page text-only data: http://msdn.microsoft.com/en-us/library/ms404294.aspx The point is, that this is...
12
by: Eps | last post by:
Hi there, I am doing the following, this is a List of audio files. this.Where(p =p.Album == AnAudioFileObject.Album).Select(s => s.Artist).Distinct().Count() 1; The aim is to determine...
1
by: daschicken | last post by:
Hi guys, currently I'm encountering a strange behavior while using the PrinterJob class. I've got a little program printing some pages. Most of the time the printer does its job as it should....
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.