调试大文本文件需要花费太多时间

时间:2016-11-09 03:18:23

标签: c++

我创建了一个数据包结构。我读了一个文件的文本并转换为字典顺序。为了做到这一点,我必须将两个字符串转换为小写以比较它们(一个用于当前节点,一个用于它旁边的节点)。但我的问题是,当我有大文本文件时,它必须继续将我插入的每个节点的字符串转换为小写,有时需要很长时间才能处理。我想知道是否有更好的方法来调整它,这样我就可以增加性能时间。

void insert(string v)
{
if(head == NULL){ //empty list

        head = new BagNode;
        head->dataValue = v;
        //head->dataCount = 0;
        head->next = NULL;

}
else
{
        BagNode * n = new BagNode;      // new node
        n->dataValue = v;
        BagNode * current = head;           //for traversal
        //current = head;
        n->dataCount = 0;
            if(!isBefore(current->dataValue, v))        //new head
            {
                n->next = head;
                head = n;
            }
            else{           //mid and tail insert
                while(current->next && isBefore(current->next->dataValue,v))
                {
                    current = current->next;
                }
                n->next = current->next;
                current->next = n;

            }   
     }      
}

比较两个节点

bool isBefore(string a, string b) 
{
  transform(a.begin(), a.end(), a.begin(), ::tolower);
  transform(b.begin(), b.end(), b.begin(), ::tolower);
    if(a == b) {
        return true;
    }
    else {
        return false;
    }
 }

1 个答案:

答案 0 :(得分:0)

我会删除对此transform的重复调用:

void insert(string v)
{
transform(v.begin(), v.end(), v.end(), ::tolower);
if(head == NULL){ //empty list

        head = new BagNode;
        head->dataValue = v;
        //head->dataCount = 0;
        head->next = NULL;

}
else
{
        BagNode * n = new BagNode;      // new node
        n->dataValue = v;
        BagNode * current = head;           //for traversal
        //current = head;
        n->dataCount = 0;
            if(!isBefore(current->dataValue, v))        //new head
            {
                n->next = head;
                head = n;
            }
            else{           //mid and tail insert
                while(current->next && isBefore(current->next->dataValue,v))
                    {
                        current = current->next;
                    }
                    n->next = current->next;
                    current->next = n;

                }   
         }      
    }

bool isBefore(string a, string b) 
{
    if(a == b) {
        return true;
    }
    else {
        return false;
    }
 }

您可以看到有关转化here的一些附加信息。这个转换的建议是在你的范围内循环。找到这样的东西的方法是在GCC上使用-pg标志进行编译。这将启用分析,您会看到包含isBeforetransform函数的热点。