C++コード:Python mmapモジュールをC++からPOSIX mmapを呼び出すよりもずっと遅いのはなぜですか?
#include <string>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <sys/time.h>
using namespace std;
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
int main() {
timeval tv1, tv2, tv3, tve;
gettimeofday(&tv1, 0);
int size = 0x1000000;
int fd = open("data", O_RDWR | O_CREAT | O_TRUNC, FILE_MODE);
ftruncate(fd, size);
char *data = (char *) mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
for(int i = 0; i < size; i++) {
data[i] = 'S';
}
munmap(data, size);
close(fd);
gettimeofday(&tv2, 0);
timersub(&tv2, &tv1, &tve);
printf("Time elapsed: %ld.%06lds\n", (long int) tve.tv_sec, (long int) tve.tv_usec);
}
Pythonコード:
import mmap
import time
t1 = time.time()
size = 0x1000000
f = open('data/data', 'w+')
f.truncate(size)
f.close()
file = open('data/data', 'r+b')
buffer = mmap.mmap(file.fileno(), 0)
for i in xrange(size):
buffer[i] = 'S'
buffer.close()
file.close()
t2 = time.time()
print "Time elapsed: %.3fs" % (t2 - t1)
私はC++とPythonは同じシステムコール(mmap
)を呼び出すので、これら二つのプログラムは基本的に同じだと思います。
しかし、Pythonのバージョンは、C++のよりもはるかに遅いです:
Python: Time elapsed: 1.981s
C++: Time elapsed: 0.062143s
いずれかののmmap PythonがC++よりもはるかに遅い理由を説明していただけますか?
環境:
C++:
$ c++ --version
Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.5.0
パイソン:
$ python --version
Python 2.7.11 :: Anaconda 4.0.0 (x86_64)
同じプログラムの実行時間を「xrange(size):x ++ 'loop? – deniss