DT closes and reopens DF memory for every read/write
This seems inefficient:
$ strace -fe open,close bin/release/DwarfTherapist
[pid 9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid 9459] close(11) = 0
[pid 9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid 9459] close(11) = 0
[pid 9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid 9459] close(11) = 0
[pid 9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid 9459] close(11) = 0
[pid 9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid 9459] close(11) = 0
[pid 9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid 9459] close(11) = 0
[pid 9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid 9459] close(11) = 0
[pid 9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid 9459] close(11) = 0
[pid 9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid 9459] close(11) = 0
[pid 9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid 9459] close(11) = 0
[pid 9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid 9459] close(11) = 0
[pid 9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid 9459] close(11) = 0
and on and on for hundreds of thousands of pages
related:
[pid 12084] ptrace(PTRACE_ATTACH, 8816, 0, 0) = 0
[pid 12084] ptrace(PTRACE_DETACH, 8816, 0, SIG_0) = 0
[pid 12084] ptrace(PTRACE_ATTACH, 8816, 0, 0) = 0
[pid 12084] ptrace(PTRACE_DETACH, 8816, 0, SIG_0) = 0
[pid 12084] ptrace(PTRACE_ATTACH, 8816, 0, 0) = 0
[pid 12084] ptrace(PTRACE_DETACH, 8816, 0, SIG_0) = 0
[pid 12084] ptrace(PTRACE_ATTACH, 8816, 0, 0) = 0
[pid 12084] ptrace(PTRACE_DETACH, 8816, 0, SIG_0) = 0
[pid 12084] ptrace(PTRACE_ATTACH, 8816, 0, 0) = 0
[pid 12084] ptrace(PTRACE_DETACH, 8816, 0, SIG_0) = 0
[pid 12084] ptrace(PTRACE_ATTACH, 8816, 0, 0) = 0
[pid 12084] ptrace(PTRACE_DETACH, 8816, 0, SIG_0) = 0
[pid 12084] ptrace(PTRACE_ATTACH, 8816, 0, 0) = 0
[pid 12084] ptrace(PTRACE_DETACH, 8816, 0, SIG_0) = 0
and on and on around 60000 times (just to attach, mind you)
strace -f DwarfTherapist generates a 128 MiB file just to start and attach to DF, running over 2 million system calls.
that explains why DT takes forever to start, when it should start faster than on Windows.
12275 ptrace(PTRACE_ATTACH, 8816, 0, 0) = 0
12275 wait4(8816, [{WIFSTOPPED(s) && WSTOPSIG(s) == SIGSTOP}], 0, NULL) = 8816
12275 open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 14
12275 fcntl(14, F_SETFD, FD_CLOEXEC) = 0
12275 fstat(14, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
12275 lseek(14, 4077169824, SEEK_SET) = 4077169824
12275 read(14, "\314TA\363<\\A\363\264YA\363\264YA\363\264YA\363\334[A\363,YA\363T\\A\363"..., 16384) = 16384
12275 close(14) = 0
12275 ptrace(PTRACE_DETACH, 8816, 0, SIG_0) = 0
to read 16 KiB.
#73 helps a lot since now only one system call needs to be made instead of nine; it would still be a good idea to simply read in the required data instead of reading it in 2-4 bytes at a time.
#150 fixes a lot of this on Windows by reading vectors in a big chunk.
it's probably a good idea to open mem and attach in the DFInstanceLinux constructor.