我正在参加一门课程,其中我们有malloc的自定义实现,取自here-write-a-simple-memory" rel="nofollow noreferrer">this article,malloc的实现可以看到here,此外,我们还有这个程序来测试实现本身(它只是进行了大量内存分配)
#include <stdlib.h>
#define MAXITERS 100000
#define MAXSIZE 1024
int main(int argc, char* argv[]) {
float pfree = atof(argv[1]);
int niter = rand() % MAXITERS;
for(int i = 0; i < niter; i++ ) {
int size = rand() % MAXSIZE;
void* p = malloc(size * sizeof(char));
float toss = (float)random() / RAND_MAX;
if ( toss > pfree )
free(p);
}
return 0;
}
问题是,每当我运行它时,在WSL 2上都需要大约30秒的时间.我朋友的计算机(配备M3 Pro)大约需要1秒,我教授的M2 Air也是如此.当然,我认为这是WSL的问题,所以我很快启动到Ubuntu 23,运行该程序,并发现它所需的时间与WSL 2相同.然后我决定在Fedora 39中运行它,并得到了同样的结果.
以下是我们正在使用的编译命令,我认为这可能是事情变得奇怪的原因.
gcc -Wno-deprecated-declarations -o libmemalloc.so -fPIC -shared memalloc.c
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
gcc testalloc.c -o testalloc -L. -lmemalloc
./testalloc 0.5
最初的说明中没有包含LD_LIBRARY_PATH的"export"关键字,因为我的教授在MacOS上工作,而且它似乎在那里工作,但是,在Linux上,没有它它们就无法工作.这是问题所在吗?出口的功能是否与MacOS版本不同?
我将上传包含我们正在运行的代码的.Zip文件,以及运行它的脚本,这就是我用于测试的内容.如果你们能够测试代码及其速度,并帮助我解决这个问题,我将不胜感激.
EDIT 我们确认它确实在MacOS上使用了我们的实际实现,我们补充道:
int x = x/0;
printf("%d", x);
到代码,在Linux上它崩溃了,但奇怪的是,在MacOS上它只打印0,我不知道这是否是正常行为,但无论哪种方式,它肯定在使用我们的实现,因为它要么崩溃,要么打印0.
[What I have tried]
try 过其他计算机和操作系统,但都是一样的(由于明显的原因,Windows除外)
try 过不同的编译命令,包括原始文章中使用LD_PREADD的命令,但它们仍然非常慢,并且会中断终端会话上的其他程序,而LD_LIBRARY_PATH似乎没有这样做.
添加 destruct 我们的malloc实现的代码(请参阅上面的编辑)这一事实进一步证明,运行我们版本的MacOS大约需要1秒,但即使是10年前的笔记本电脑,在运行实际的malloc()时也会在0.0秒内完成(使用time命令),所以MacO肯定运行我们版本的malloc().