Changeset 1485

Show
Ignore:
Timestamp:
05/19/04 21:09:36 (20 years ago)
Author:
jalet
Message:

Speed improvement

Location:
pykota/trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • pykota/trunk/NEWS

    r1483 r1485  
    2424    - 1.19alpha10 : 
    2525     
     26        - 25% Speedup in PCL parser. Getting more of the Python version 
     27          will probably be difficult, since the completely table driven  
     28          parser I wrote is slower than the original algorithm. Then, 
     29          the original algorithm is still used for now. 
     30          Probable that more speed could be achieved using mmap, at the 
     31          expense of severe memory consumption. 
     32         
    2633        - configuration simplifications : the "accounter" directive's 
    2734          'hardware' arguments now accepts what was in the "requester" 
  • pykota/trunk/pykota/pdlanalyzer.py

    r1482 r1485  
    2222# 
    2323# $Log$ 
     24# Revision 1.2  2004/05/19 19:09:36  jalet 
     25# Speed improvement 
     26# 
    2427# Revision 1.1  2004/05/18 09:59:54  jalet 
    2528# pkpgcounter is now just a wrapper around the PDLAnalyzer class 
     
    5457        """Initialize PCL Analyzer.""" 
    5558        self.infile = infile 
     59         
     60    def skip(self, nb) :     
     61        """Reads a new datablock.""" 
     62        newpos = self.pos + nb 
     63        if newpos >= self.len : 
     64            oldlen = self.len 
     65            self.data = self.infile.read(1024*1024) 
     66            self.len = len(self.data) 
     67            if not self.len : 
     68                return 
     69            self.pos = newpos - oldlen 
     70        else :     
     71            self.pos = newpos 
     72         
     73    def readone(self) : 
     74        """Reads a new byte.""" 
     75        if self.pos < self.len : 
     76            char = self.data[self.pos] 
     77        else :     
     78            self.data = self.infile.read(1024*1024) 
     79            self.len = len(self.data) 
     80            self.pos = 0 
     81            if not self.len :     
     82                return 
     83            char = self.data[0] 
     84        self.pos += 1     
     85        return char 
    5686         
    5787    def getJobSize(self) :      
     
    84114                     "&p" : "X",  
    85115                     "&l" : "X" }  
     116        self.data = []              
     117        self.pos = self.len = 0 
    86118        copies = 1 
    87119        pagecount = resets = 0 
    88120        tag = None 
    89121        while 1 : 
    90             char = self.infile.read(1) 
     122            char = self.readone() 
    91123            if not char :       # EOF ? 
    92124                break    
     
    110142                #     <ESC>&p###X -> Start of a non printable characters block 
    111143                # 
    112                 tagstart = self.infile.read(1) 
     144                tagstart = self.readone() 
    113145                if tagstart in "E9=YZ" : # one byte PCL tag 
    114146                    if tagstart == "E" : 
    115147                        resets += 1 
    116148                    continue             # skip to next tag 
    117                 tag = tagstart + self.infile.read(1) 
     149                tag = tagstart + self.readone() 
    118150                try : 
    119151                    tagend = tagsends[tag] 
     
    124156                    size = 0 
    125157                    while 1 : 
    126                         char = self.infile.read(1) 
     158                        char = self.readone() 
    127159                        if not char.isdigit() : 
    128160                            break 
     
    139171                                # which is before the string itself 
    140172                                size += 1 
    141                             self.infile.read(size) # skips block, while avoiding seek() 
     173                            self.skip(size) 
    142174                             
    143175        # if pagecount is still 0, we will return the number