Ignore:
Timestamp:
Nov 20, 2012, 5:29:13 PM (6 years ago)
Author:
linmengl
Message:

use store_unaligned to for speed

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/CSV/csv2xml/util/csv2xmlwriter.hpp

    r2611 r2663  
    55*/
    66#include <cstdio>
     7#include <cstdlib>
    78#include <cstring>
    8 #include <cstdlib>
     9#include "../lib/bitblock.hpp"
    910
    10 const int NO_FILE_OUTPUT = 1;
     11#define FILE_OUTPUT
     12
     13int8_t outBuf[SEGMENT_SIZE * 40];
    1114
    1215class Csv2XmlWriter
     
    1720    int _colStarted;
    1821    int _needClose;
    19     unsigned int _outCount;
     22    int _bufCount;
    2023
    21     void printString(const char *s)
     24public:
     25    inline void flush()
    2226    {
    23         if (NO_FILE_OUTPUT)
    24             _outCount += strlen(s);
    25         else
    26             fprintf(_fout, "%s", s);
     27        #ifdef FILE_OUTPUT
     28        fwrite((void *)outBuf, 1, _bufCount, _fout);
     29        #endif
     30        _bufCount = 0;
    2731    }
    2832
    29 public:
     33    unsigned long long _outCount;
     34
    3035    Csv2XmlWriter(FILE *fout)
    3136    {
     
    4550    {
    4651        writeRootEnd();
    47 
     52        flush();
    4853        if (_needClose)
    4954            fclose( _fout );
    5055    }
    5156
    52     void writeColumn(char* fullColumnContent)
     57    void writeColumn(char* fullColumnContent, int len)
    5358    {
    54         if (fullColumnContent[0] == 0)
     59        if (len == 0)
    5560            return;
    5661
     
    6065        }
    6166
    62         writeContent(fullColumnContent);
     67        writeContent(fullColumnContent, len);
    6368    }
    6469
     
    8085
    8186private:
    82     int _rowDepth;
    83     int _colDepth;
    84     void init()
     87    union StringBitBlock
    8588    {
    86         writeRootStart();
     89        char col_string[12];
     90        BitBlock col_block;
     91    };
     92
     93    StringBitBlock rol_start;
     94    StringBitBlock rol_end;
     95    StringBitBlock col_start;
     96    StringBitBlock col_end;
     97
     98    inline void init()
     99    {
    87100        _rowStarted = 0;
    88101        _colStarted = 0;
    89         _rowDepth = 0;
    90         _colDepth = 0;
    91102        _outCount = 0;
     103        _bufCount = 0;
     104        strcpy(rol_start.col_string, "   <row>\n");
     105        strcpy(rol_end.col_string, "   </row>\n");
     106        strcpy(col_start.col_string, "      <col>");
     107        strcpy(col_end.col_string, "</col>\n");
     108
     109        writeRootStart();
    92110    }
    93111
    94     inline void writeContent(char* fullColumnContent)
     112     //Profile result is oppsite this function.
     113    inline void printString(const char *s, int len)
    95114    {
    96         printString(fullColumnContent);
     115        memcpy((char *)outBuf + _bufCount, s, len);
     116        _bufCount += len;
     117        _outCount += len;
     118    }
     119
     120    inline void printConst(StringBitBlock &out, int len)
     121    {
     122        bitblock::store_unaligned(out.col_block, (BitBlock *) ((char *)outBuf + _bufCount));
     123        _bufCount += len;
     124        _outCount += len;
     125    }
     126
     127    inline void writeContent(char* fullColumnContent, int len)
     128    {
     129        printString(fullColumnContent, len);
    97130    }
    98131
    99132    inline void writeRootStart()
    100133    {
    101         printString("<root>\n");
     134        printString("<root>\n", 7);
    102135    }
    103136
    104137    inline void writeRootEnd()
    105138    {
    106         printString("</root>\n");
     139        if (_colStarted)
     140            writeColumnEnd();
     141        if (_rowStarted)
     142            writeRowEnd();
     143
     144        printString("</root>\n", 8);
    107145    }
    108146
    109147    inline void writeRowStart()
    110148    {
    111         printString("   <row>\n");
    112         _rowDepth++;
     149        printConst(rol_start, 9);
    113150        _rowStarted = 1;
    114151    }
     
    116153    inline void writeRowEnd()
    117154    {
    118         if (_rowDepth)
    119         {
    120             printString("   </row>\n");
    121             _rowDepth--;
    122         }
     155        printConst(rol_end, 10);
    123156        _rowStarted = 0;
    124157    }
     
    130163            writeRowStart();
    131164        }
    132 
    133         printString("      <col>");
    134         _colDepth ++;
     165        printConst(col_start, 11);
    135166        _colStarted = 1;
    136167    }
     
    138169    inline void writeColumnEnd()
    139170    {
    140         if (_colDepth)
    141         {
    142             printString("</col>\n");
    143             _colDepth--;
    144         }
     171        printConst(col_end, 7);
    145172        _colStarted = 0;
    146173    }
Note: See TracChangeset for help on using the changeset viewer.