LINUX.ORG.RU

История изменений

Исправление SZT, (текущая версия) :

Надеюсь ты понимаешь, что твои коды неравнозначны? Хотя бы потому что политика расширения размера вектора другая.

Если и то и другое запустить под strace, можно заметить что числа там такие же

С код:

mmap(NULL, 266240, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa39eb99000
mremap(0x7fa39eb99000, 266240, 528384, MREMAP_MAYMOVE) = 0x7fa39eb18000
mremap(0x7fa39eb18000, 528384, 1052672, MREMAP_MAYMOVE) = 0x7fa39ea17000
mremap(0x7fa39ea17000, 1052672, 2101248, MREMAP_MAYMOVE) = 0x7fa39e41e000
mremap(0x7fa39e41e000, 2101248, 4198400, MREMAP_MAYMOVE) = 0x7fa39e01d000
mremap(0x7fa39e01d000, 4198400, 8392704, MREMAP_MAYMOVE) = 0x7fa39d81c000
mremap(0x7fa39d81c000, 8392704, 16781312, MREMAP_MAYMOVE) = 0x7fa39c81b000
mremap(0x7fa39c81b000, 16781312, 33558528, MREMAP_MAYMOVE) = 0x7fa39a81a000
mremap(0x7fa39a81a000, 33558528, 67112960, MREMAP_MAYMOVE) = 0x7fa396819000
mremap(0x7fa396819000, 67112960, 134221824, MREMAP_MAYMOVE) = 0x7fa38e818000
mremap(0x7fa38e818000, 134221824, 268439552, MREMAP_MAYMOVE) = 0x7fa37e817000
mremap(0x7fa37e817000, 268439552, 536875008, MREMAP_MAYMOVE) = 0x7fa35e816000
munmap(0x7fa35e816000, 536875008)       = 0
exit_group(0)                           = ?

С++ код:

brk(0)                                  = 0x82b000
brk(0x84c000)                           = 0x84c000
mmap(NULL, 135168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84ebb18000
mmap(NULL, 266240, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84ebacc000
munmap(0x7f84ebb18000, 135168)          = 0
mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84eba4b000
munmap(0x7f84ebacc000, 266240)          = 0
mmap(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84eb94a000
munmap(0x7f84eba4b000, 528384)          = 0
mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84eab33000
munmap(0x7f84eb94a000, 1052672)         = 0
mmap(NULL, 4198400, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84ea732000
munmap(0x7f84eab33000, 2101248)         = 0
mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84e9f31000
munmap(0x7f84ea732000, 4198400)         = 0
mmap(NULL, 16781312, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84e8f30000
munmap(0x7f84e9f31000, 8392704)         = 0
mmap(NULL, 33558528, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84e6f2f000
munmap(0x7f84e8f30000, 16781312)        = 0
mmap(NULL, 67112960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84e2f2e000
munmap(0x7f84e6f2f000, 33558528)        = 0
mmap(NULL, 134221824, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84daf2d000
munmap(0x7f84e2f2e000, 67112960)        = 0
mmap(NULL, 268439552, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84caf2c000
munmap(0x7f84daf2d000, 134221824)       = 0
mmap(NULL, 536875008, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84aaf2b000
munmap(0x7f84caf2c000, 268439552)       = 0
munmap(0x7f84aaf2b000, 536875008)       = 0
exit_group(0)                           = ?

Последовательность 266240 528384 1052672 2101248 из системных вызовов mremap там такая же, как в плюсовом коде с STL последовательность вызовов mmap. Притом в плюсах каждый раз через memcpy приходится копировать данные из старой в свежеmmap-нутую память, что конечно же очень хреново с т.з. производительности

Ну и чтоб было совсем интереснее, давай аналог std::deque сделай, там поржем.

Сделаю, когда в ядре системный вызов типа mremap будет, который бы умел не только к хвосту добавлять, но и к голове.

Исходная версия SZT, :

Надеюсь ты понимаешь, что твои коды неравнозначны? Хотя бы потому что политика расширения размера вектора другая.

Если и то и другое запустить под strace, можно заметить что числа там такие же

С код:

mmap(NULL, 266240, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa39eb99000
mremap(0x7fa39eb99000, 266240, 528384, MREMAP_MAYMOVE) = 0x7fa39eb18000
mremap(0x7fa39eb18000, 528384, 1052672, MREMAP_MAYMOVE) = 0x7fa39ea17000
mremap(0x7fa39ea17000, 1052672, 2101248, MREMAP_MAYMOVE) = 0x7fa39e41e000
mremap(0x7fa39e41e000, 2101248, 4198400, MREMAP_MAYMOVE) = 0x7fa39e01d000
mremap(0x7fa39e01d000, 4198400, 8392704, MREMAP_MAYMOVE) = 0x7fa39d81c000
mremap(0x7fa39d81c000, 8392704, 16781312, MREMAP_MAYMOVE) = 0x7fa39c81b000
mremap(0x7fa39c81b000, 16781312, 33558528, MREMAP_MAYMOVE) = 0x7fa39a81a000
mremap(0x7fa39a81a000, 33558528, 67112960, MREMAP_MAYMOVE) = 0x7fa396819000
mremap(0x7fa396819000, 67112960, 134221824, MREMAP_MAYMOVE) = 0x7fa38e818000
mremap(0x7fa38e818000, 134221824, 268439552, MREMAP_MAYMOVE) = 0x7fa37e817000
mremap(0x7fa37e817000, 268439552, 536875008, MREMAP_MAYMOVE) = 0x7fa35e816000
munmap(0x7fa35e816000, 536875008)       = 0
exit_group(0)                           = ?

С++ код:

brk(0)                                  = 0x82b000
brk(0x84c000)                           = 0x84c000
mmap(NULL, 135168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84ebb18000
mmap(NULL, 266240, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84ebacc000
munmap(0x7f84ebb18000, 135168)          = 0
mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84eba4b000
munmap(0x7f84ebacc000, 266240)          = 0
mmap(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84eb94a000
munmap(0x7f84eba4b000, 528384)          = 0
mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84eab33000
munmap(0x7f84eb94a000, 1052672)         = 0
mmap(NULL, 4198400, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84ea732000
munmap(0x7f84eab33000, 2101248)         = 0
mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84e9f31000
munmap(0x7f84ea732000, 4198400)         = 0
mmap(NULL, 16781312, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84e8f30000
munmap(0x7f84e9f31000, 8392704)         = 0
mmap(NULL, 33558528, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84e6f2f000
munmap(0x7f84e8f30000, 16781312)        = 0
mmap(NULL, 67112960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84e2f2e000
munmap(0x7f84e6f2f000, 33558528)        = 0
mmap(NULL, 134221824, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84daf2d000
munmap(0x7f84e2f2e000, 67112960)        = 0
mmap(NULL, 268439552, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84caf2c000
munmap(0x7f84daf2d000, 134221824)       = 0
mmap(NULL, 536875008, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84aaf2b000
munmap(0x7f84caf2c000, 268439552)       = 0
munmap(0x7f84aaf2b000, 536875008)       = 0
exit_group(0)                           = ?


Последовательность 266240 528384 1052672 2101248 из системных вызовов mremap там такая же, как в плюсовом коде с STL последовательность вызовов mmap. Притом в плюсах каждый раз через memcpy приходится копировать данные из старой в свежеmmap-нутую память, что конечно же очень хреново с т.з. производительности
>Ну и чтоб было совсем интереснее, давай аналог std::deque сделай, там поржем.
Сделаю, когда в ядре системный вызов типа mremap будет, который бы умел не только к хвосту добавлять, но и к голове.