我有一个结构体链表。假设我向该链表插入x百万个节点,然后我遍历所有节点以查找给定值。
奇怪的是(至少对我来说),如果我的结构体像这样:
然后我可以遍历列表并检查一个值,速度比当我有另一个结构成员时快十倍,就像这样:
我还尝试使用 C 风格的字符串(char 数组),结果是一样的:即使我从未触及那个成员,只因为我有另一个成员(字符串),整个迭代(+值检查)也变慢了 10 倍。现在,我不知道结构体的内部工作原理,但看起来这是一个很高的代价...
问题出在哪里? 编辑: 我是个初学者,这是我第一次使用指针,所以错误很可能是我自己的问题。 我会尽快发布代码(现在不在家)。 更新: 我再次检查了值,并且现在看到的差异要小得多:2 倍而不是 10 倍。 这显然更加合理。
虽然昨天也可能是这种情况,但我太累了,无法计算两个数字,但我已经进行了更多测试,结果令人惊讶。
相同节点数量的时间如下:
1. 一个 int 和一个指针迭代所需的时间为 0.101。 2. 一个 int 和一个字符串:0.196。 3. 一个 int 和两个字符串:0.274。 4. 一个 int 和三个字符串:0.147 (!!!)。 5. 对于两个 int,它是:0.107。
当结构中有两个以上的字符串时会发生什么! 它会变得更快! 有人向我的咖啡里放了LSD吗? 不! 我不喝咖啡。
对于我目前的大脑来说,这太过疯狂了,所以我想自己找出问题,而不是浪费公共资源。
(广告:我不认为我的分析类有错误,无论如何我都可以用自己的眼睛看到时间差异)
不管怎样,谢谢你的帮助。
奇怪的是(至少对我来说),如果我的结构体像这样:
struct node
{
int a;
node *nxt;
};
然后我可以遍历列表并检查一个值,速度比当我有另一个结构成员时快十倍,就像这样:
struct node_complex
{
int a;
string b;
node_complex *nxt;
};
我还尝试使用 C 风格的字符串(char 数组),结果是一样的:即使我从未触及那个成员,只因为我有另一个成员(字符串),整个迭代(+值检查)也变慢了 10 倍。现在,我不知道结构体的内部工作原理,但看起来这是一个很高的代价...
问题出在哪里? 编辑: 我是个初学者,这是我第一次使用指针,所以错误很可能是我自己的问题。 我会尽快发布代码(现在不在家)。 更新: 我再次检查了值,并且现在看到的差异要小得多:2 倍而不是 10 倍。 这显然更加合理。
虽然昨天也可能是这种情况,但我太累了,无法计算两个数字,但我已经进行了更多测试,结果令人惊讶。
相同节点数量的时间如下:
1. 一个 int 和一个指针迭代所需的时间为 0.101。 2. 一个 int 和一个字符串:0.196。 3. 一个 int 和两个字符串:0.274。 4. 一个 int 和三个字符串:0.147 (!!!)。 5. 对于两个 int,它是:0.107。
当结构中有两个以上的字符串时会发生什么! 它会变得更快! 有人向我的咖啡里放了LSD吗? 不! 我不喝咖啡。
对于我目前的大脑来说,这太过疯狂了,所以我想自己找出问题,而不是浪费公共资源。
(广告:我不认为我的分析类有错误,无论如何我都可以用自己的眼睛看到时间差异)
不管怎样,谢谢你的帮助。
int
字段吗? - Péter Törökstd::list
更容易出错,而且可能不如效率高。std::vector
或std::deque
并享受更好的缓存使用率。像往常一样,性能问题通常只是糟糕的设计选择。