Código con QString lento



  • Soy nuevo en QT y estoy migrando una aplicación que tengo hecha en java, me encuentro con un problema de rendimiento al tratar un fichero, este fichero tiene almacenadas unas coordenadas en formato texto, para manejar estas coordenadas me he creado una clase que separa cada una de las coordenadas y las convierte a QString, el código es idéntico al de java, me encuentro que este proceso en java tarda bastante menos que en QT, no se que estoy haciendo mal, ya que me parece raro este problema.

    las clases son las siguientes:

    Coordenada.cpp

    QString Coordenada::getComentario() {
        if (comentario == QString::null) {
            return "";
        }
        return comentario;
    }
    
    void Coordenada::setComentario(QString comentario) {
        this->comentario = comentario;
    }
    
    
    Coordenada::Coordenada() {
        x="0";
        y="0";
        z="0";
        mantisa = "";
    }
    
    QString Coordenada::getMantisa() {
        return mantisa;
    }
    QString Coordenada::getMantisa(QString dato) {
            QString mantisa = "";
            for (int x = 0; x < dato.length(); x++) {
                switch (dato.at(x).toLatin1()) {
                    case 'G':
                    case 'X':
                    case 'Y':
                    case 'Z':
                    case 'M':
                    case 'H':
                    case 'R':
                    case 'A':
                    case 'I':
                    case 'J':
                    case 'K':
                    case 'S':
                    case 'T':
                    case 'P':
                    case 'F':
                        mantisa = mantisa % dato.at(x).toLatin1() % " ";
                }
            }
            return mantisa;
    }
    void Coordenada::setMantisa(QString datos) {
        mantisa = getMantisa(datos);
    }
    
    Coordenada::Coordenada(QString lineacodigo) {
        procesaLinea(lineacodigo);
        setMantisa(lineacodigo);
    }
    
    bool Coordenada::isX() {
        if (x == QString::null) {
            return false;
        } else {
            return true;
        }
    }
    
    bool Coordenada::isY() {
        if (y == QString::null) {
            return false;
        } else {
            return true;
        }
    }
    
    bool Coordenada::isZ() {
        if (z == QString::null) {
            return false;
        } else {
            return true;
        }
    }
    
    QString Coordenada::getX() {
        if (x == QString::null) {
            return "";
        }
        return x;
    }
    
    float Coordenada::getNumeroX() {
        if (x == QString::null) {
            return 0;
        }
        return x.toFloat();
    }
    
    void Coordenada::setX(QString x) {
        this->x = x;
        anadeMantisa("X");
    }
    
    void Coordenada::setX(float x) {
        this->x = x;
        anadeMantisa("X");
    }
    
    QString Coordenada::getY() {
        if (y == QString::null) {
            return "";
        }
        return y;
    }
    
    float Coordenada::getNumeroY() {
        if (y == QString::null) {
            return 0;
        }
        return y.toFloat();
    }
    
    void Coordenada::setY(QString y) {
        this->y = y;
        anadeMantisa("Y");
    }
    
    void Coordenada::setY(float y) {
        this->y = y;
        anadeMantisa("Y");
    }
    
    QString Coordenada::getZ() {
        if (z == QString::null) {
            return "";
        }
        return z;
    }
    
    float Coordenada::getNumeroZ() {
        if (z == QString::null) {
            return 0;
        }
        return z.toFloat();
    }
    
    void Coordenada::setZ(QString z) {
        this->z = z;
        anadeMantisa("Z");
    }
    
    void Coordenada::setZ(float z) {
        this->z = z;
        anadeMantisa("Z");
    }
    
    void Coordenada::anadeMantisa(QString parametro) {
        if (mantisa == QString::null) {
            mantisa = parametro;
        }
        if (!mantisa.contains(parametro)) {
            mantisa = mantisa % " " % parametro;
        }
    }
    void Coordenada::procesaLinea(QString codigo) {
        int pos = 0;
        codigo = codigo.trimmed();
        comentario = "";
        while (pos < codigo.length()) {
            char letra = codigo.at(pos++).toLatin1();
            if (pos >= codigo.length()) {
                if (letra == '/') {
                    comentario = "/";
                } else {
                    comentario = comentario % letra;
                }
                break;
            }
            switch (letra) {
                case 'X':
                    if (!isNumeric(codigo.at(pos).toLatin1()) && codigo.at(pos) != '-' && codigo.at(pos) != '+') {
                        comentario = comentario % letra;
                        break;
                    }
                    x = "";
                    while (pos < codigo.length() && (isNumeric(codigo.at(pos).toLatin1()) || codigo.at(pos) == '.' || codigo.at(pos) == '-' || codigo.at(pos) == '+')) {
                        letra = codigo.at(pos++).toLatin1();
                        x = x % letra;
                    }
                    x = x.trimmed();
                    break;
                case 'Y':
                    if (!isNumeric(codigo.at(pos).toLatin1()) && codigo.at(pos) != '-' && codigo.at(pos) != '+') {
                        comentario = comentario % letra;
                        break;
                    }
                    y = "";
                    while (pos < codigo.length() && (isNumeric(codigo.at(pos).toLatin1()) || codigo.at(pos) == '.' || codigo.at(pos) == '-' || codigo.at(pos) == '+')) {
                        letra = codigo.at(pos++).toLatin1();
                        y = y % letra;
                    }
                    y = y.trimmed();
                    break;
                case 'Z':
                    if (!isNumeric(codigo.at(pos).toLatin1()) && codigo.at(pos) != '-' && codigo.at(pos) != '+') {
                        comentario = comentario % letra;
                        break;
                    }
                    z = "";
                    while (pos < codigo.length() && (isNumeric(codigo.at(pos).toLatin1()) || codigo.at(pos) == '.' || codigo.at(pos) == '-' || codigo.at(pos) == '+')) {
                        letra = codigo.at(pos++).toLatin1();
                        z = z % letra;
                    }
                    z = z.trimmed();
                    break;
                default:
                    if (letra != ' ') {
                        do {
                            comentario = comentario % letra;
                            if (pos < codigo.length()) {
                                letra = codigo.at(pos++).toLatin1();
                            }
                        } while (pos < codigo.length() && letra != ' ');
                        if (pos <= codigo.length()) {
                            comentario = comentario % letra;
                        }
                    }
                    break;
            }
        }
        if (this->comentario.length() > 0 && !(this->comentario.mid(0, 1)=="/")) {
            if (x.length()>0 || y.length()>0 || z.length() ) {
                if (comentario.length()>0) {
                    this->comentario = QString::QString::null;
                }
            }
        }
    }
    
    bool Coordenada::isComentario() {
        if (comentario == QString::null || comentario.length() == 0) {
            return false;
        } else {
            return true;
        }
    }
    
    bool Coordenada::isNull() {
        if (!this->isX() && !this->isY() && !this->isZ()) {
            return true;
        } else {
            return false;
        }
    }
    
    bool Coordenada::isNumeric(char cadena) {
        if ('0' <= cadena && cadena <= '9' )
            return true;
        else
            return false;
    }
    

    main.cpp

    void leeArchivo(){
    QFile archivo("c:\\coordenadas.txt");
    int lineas = 0;
    float maxX = -10000;
    float maxY = -10000;
    float minX = 10000;
    float minY = 10000;
    float maxZ = -10000;
    float minZ = 10000;
    bool hayX = false;
    bool hayY = false;
    QString strLinea;
    Coordenada elementoAnterior();
    if (archivo.open(QFile::ReadOnly)){
        QTextStream in(&archivo);
        QDateTime tiempo = QDateTime::currentDateTime();
        while (!in.atEnd()) {
            QString strline(in.readLine());
            lineas++;
            Coordenada elemento(strLinea);
            if (maxX < elemento.getNumeroX()) {
                maxX = elemento.getNumeroX();
            }
            if (minX > elemento.getNumeroX()) {
                minX = elemento.getNumeroX();
            }
            if (maxY < elemento.getNumeroY()) {
                maxY = elemento.getNumeroY();
            }
            if (minY > elemento.getNumeroY()) {
                minY = elemento.getNumeroY();
            }
            if (maxZ < elemento.getNumeroZ()) {
                maxZ = elemento.getNumeroZ();
            }
            if (minZ > elemento.getNumeroZ() ) {
                minZ = elemento.getNumeroZ();
            }
            if (elemento.isX()) {
                hayX = true;
            }
            if (elemento.isY()) {
                hayY = true;
            }
        }
        qDebug()<<"tiempo"<<tiempo.msecsTo(QDateTime::currentDateTime());
        archivo.close();
    }
    }
    int main(int argc, char *argv[])
    {
    QApplication a(argc, argv);
    
    leeArchivo();
    return 0;
    }


  • He estado haciendo mas prueba, y me encuentro en una situación que no entiendo, como he dicho antes el código es mas lento en QT que en java, para el archivo de pruebas que tengo en java lo procesa en 343 mili segundos y en QT lo procesa en 550 mili segundos, en principio no parece mucho, pero este código lo ejecuto dentro de la aplicación a la que pertenece y lo procesa en 2300 mili segundos. Esto me descoloca mucho mas, y no se que esta pasando, alguien tiene alguna idea de que pasa?


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.