有没有一种随机遍历数组的方法?

时间:2019-01-23 02:53:38

标签: c

我正在尝试将线性内存访问与随机内存访问进行比较。我按其索引顺序遍历一个数组,以记录线性内存访问的性能。但是,为了通过随机存储器访问记录存储器的性能,我想随机遍历数组,即arr[8], arr[17], arr[34], arr[2] ...

我可以使用指针追逐来实现此目的,同时确保没有两次访问索引吗?在这种情况下,指针追逐是最理想的方法吗?

2 个答案:

答案 0 :(得分:1)

如果您的目标是证明顺序访问比非顺序访问要快,那么简单地追逐后者并不是解决问题的好方法。您将比较通过单个指针加简单偏移量的访问与在偏移之前减少一个或多个指针的访问。

要使用指针追逐,必须将其应用于两种情况。这是一个示例:

int arr[n], i;
int *unshuffled[n];
int *shuffled[n];

for(i = 0; i < n; i++) {
    unshuffled[i] = arr + i;
}
/* I'll let you figure out how to randomize your indices */
shuffle(unshuffled, shuffled)

/* Do toning on these two loops */
for(i = 0; i < n; i++) {
    do_stuff(*unshuffled[i]);
}
for(i = 0; i < n; i++) {
    do_stuff(*shuffled[i]);
}

但是,您希望更好地计时直接访问的时间,您可以构造一些简单的公式来推进索引,而不是完全随机地进行访问:

for(i = 0; i < n; i++) {
    do_stuff(arr[i]);
}
for(i = 0; i < n; i++) {
    do_stuff(arr[i / 2 + (i % 2) * (n / 2)]);
}

如图所示,该方法仅对n也能正常工作,但它说明了这个想法。在计算do_stuff中的索引时,您甚至可以弥补额外的触发器。

最多苹果测试可能是从字面上访问所需的索引,而无需循环或进行其他计算:

do_stuff(arr[0]);
do_stuff(arr[1]);
do_stuff(arr[2]);
...

do_stuff(arr[123]);
do_stuff(arr[17]);
do_stuff(arr[566]);
...

由于我想您会使用大型数组进行测试,因此可以编写一个程序为您生成实际的测试代码,并可能编译并运行结果。

答案 1 :(得分:-1)

我可以告诉您,对于C中的数组,访问时间是恒定的,而不管要访问的索引如何。随机或顺序访问它们之间没有什么区别,除了随机化本身会引入额外的计算这一事实之外。

但是,要真正回答您的问题,您可能最好构建某种查找数组并将其洗牌几次,然后使用该数组获取下一个索引。显然,这样做将使您依次访问两个数组,并随机访问另一个数组,从而使该练习几乎毫无用处。