Случайная вставка и удаление Swift Array очень медленно - PullRequest
3 голосов
/ 27 января 2020

Мне нужно работать с огромными массивами (более миллиарда элементов), в которых хранятся (неупорядоченные) индексы больших данных (в порядке петабайт и хранятся в матрице SSD).
Размер Массивы не сильно различаются (максимум 10-15%), но для них требуется много операций вставки / удаления.
В некоторых тестах я обнаружил пугающую медлительность, даже для небольших размеров (10 миллионов элементов), которые - изначально - я объясняется неправильной настройкой контроллеров SSD.
При исследовании узкого места я написал программное обеспечение, чтобы определить, в чем проблема.
Я нашел его во вставке (_: at:) и удалить (at:) функций (как для Array , так и для ContiguousArray ).
Чтобы проверить, насколько серьезной была проблема, я написал тест программа, которая проверяет, сколько времени затрачивается - с массивами из 1, 10 и 100 миллионов элементов - для дополнительного количества пар «удаления / вставки» в случайных положениях.
Для возможности воспроизведения Испытание, данные, с которыми нужно работать (и позиции, в которых нужно выполнять удаление и вставку), я получаю из генератора случайных чисел, соответственно посеянного.

import Foundation
import GameplayKit
import CryptoKit

// Parameters - begin -------------------------------------------------------------------------
let ELEMENTS  : Int = 1_000_000   // and 10_000_000 and 100_000_000, also used as seed for the random number generator
let ROUND_MAX : Int = (1 << 30)   // 1_073_741_824
// Parameters - end -------------------------------------------------------------------------

// Some output formatting aid - begin -------------------------------------------------------------------------
extension String {
  func leftPadding (_ length : Int) -> String {
    if (length > self.count) {
      return (String (repeating : " ", count : (length - self.count)) + self)
    }
    else {
      return (self)
    }
  }
}
let formatterInt    : NumberFormatter = { let numberFormatter : NumberFormatter = NumberFormatter ()
                                          numberFormatter.format                = "#,##0"
                                          return (numberFormatter)                                   } ()
let formatterDouble : NumberFormatter = { let numberFormatter : NumberFormatter = NumberFormatter ()
                                          numberFormatter.format                = "#,##0.000"
                                          return (numberFormatter)                                  } ()
// Some output formatting aid - end -------------------------------------------------------------------------

// Random generator and time sample initialization - begin -------------------------------------------------------------------------
let randomizer       : GKARC4RandomSource = GKARC4RandomSource (seed : String (ELEMENTS).data (using : String.Encoding.utf8)!)
var machTimebaseInfo : mach_timebase_info = mach_timebase_info ()
mach_timebase_info (&(machTimebaseInfo))
var elapsed : UInt64 = 0 // nanoseconds
// Random generator and time sample initialization - end -------------------------------------------------------------------------

// Array initialization and preload - begin -------------------------------------------------------------------------
var array : Array<Int> = Array<Int> ()
array.reserveCapacity (ELEMENTS)
while (array.count < ELEMENTS) {
  array.append (randomizer.nextInt ())
}
// Array initialization and preload - end -------------------------------------------------------------------------

// Header output - begin -------------------------------------------------------------------------
print ("\nArray size : \(formatterInt.string (for : ELEMENTS)!) elements\n")
print ("       Rounds        Elapsed (s)                                                     Hash (SHA256)")
// Header output - end -------------------------------------------------------------------------

// Benchmark - begin -------------------------------------------------------------------------
var limit   : Int = 1
var counter : Int = 0
repeat {
  let start : UInt64 = ((mach_absolute_time () * UInt64 (machTimebaseInfo.numer)) / UInt64 (machTimebaseInfo.denom)) // nanoseconds
  // Test section begin -------------------------------------------------------------------------
  array.remove (at : randomizer.nextInt (upperBound : ELEMENTS))
  array.insert (randomizer.nextInt (), at : randomizer.nextInt (upperBound : ELEMENTS))
  // Test section end -------------------------------------------------------------------------
  let stop : UInt64 = ((mach_absolute_time () * UInt64 (machTimebaseInfo.numer)) / UInt64 (machTimebaseInfo.denom)) // nanoseconds
  elapsed += (stop - start)
  counter += 1
  if (counter == limit) {
    // Hash calculation begin -------------------------------------------------------------------------
    var data : Data = Data ()
    for element in array {
      var item : Int = element
      data += Data (bytes : &(item), count : MemoryLayout<Int>.size )
    }
    // Hash calculation end -------------------------------------------------------------------------
    limit <<= 1
    print ("\(formatterInt.string (for : counter)!.leftPadding (13))  \(formatterDouble.string (for : (Double (elapsed) / 1_000_000_000.0))!.leftPadding (17))  \(SHA256.hash (data : data).compactMap { String (format : "%02x", $0) }.joined ())")
  }
}
while (counter < ROUND_MAX)
// Benchmark - end -------------------------------------------------------------------------


Результаты несколько устрашающие.

Array size : 1,000,000 elements

       Rounds        Elapsed (s)                                                     Hash (SHA256)
            1              0.002  138a3face9a95b3a5ba3f089b58c1e2067541e04fd5605841db62998a543ea29
            2              0.003  5b295b2183d1412143ea243610b5e8e6eb8f7253e7726aab4e840b64281d675a
            4              0.004  bb20a52f6730374c3e37d39b7e8ace180aa46aba3af87a454247c48c9f681e22
            8              0.007  d9f512c044e227d5f3df9343f1af7ec6297bd484c7ffb52b14c8acf9b65ba91b
           16              0.012  bbb1c4838300b3ae70227b4d85ab5de87f0dc75fd08a5bb48120a3703e391087
           32              0.024  f2930403b4ad701d76558eed0ef5a51973f7be7ac641157d7abb0e3c35e75f17
           64              0.045  80cb2479d11e2a83dcedca1f59bf11746fe0f513ee5a79cfb1c2e1f1a036d7bb
          128              0.092  e3c0495d8b2918bb65d1d33e5170ccc0f056b295ea912c1af46b410fc44e9796
          256              0.188  391d7ce33e0fc12f4c14928d55a3e869488a32ad580caf4cfdedbbbe3d7cb44f
          512              0.372  41d4c93d04437531ca1463a61608152369f23a2fbdc25780f2975446b51f857f
        1,024              0.752  f8287bec62c5fd41cdf3cc820f943688c31afc328aff8edf6a8e2a72060448d4
        2,048              1.508  c5de93d9d1c1f449184d46a56796600038a34d39ff97d582b5d6b85a0f5cc970
        4,096              3.009  3691fe4a09aba4a192cd7d1b3d9a99541230df1da0efc956a807d2960c129acf
        8,192              5.907  fcea1f69f59be2826f9894858d0ba0ca66728ab0d6a6bbc6ea2bc3bd7f884e7a
       16,384             11.753  68e40ebd65e232dcfbe8dda1867de2cfaa33cb79a24553dc590b94a6429aa804
       32,768             23.332  6168f321dcdc4e7457c383662b33067e5a70dac17a8c0d32903b801570316963
       65,536             46.451  e5526d34f40a43151b1848e16b203e35b1ba2c05dc104dc8f7394c26480f91f8
      131,072             92.733  cd7e7d27085f74f38800d40a4f6400998c3bf9a01e5dd76da57e6be48e50ceb7
      262,144            185.075  0b263633bd06999866994e2670c0094e63514190aaa2aa7437d9274c98d24dc6
      524,288            369.582  4d990804a9a39e5a31805c54479b669aec670ba10667c36bf7a5821d211e5e45
    1,048,576            739.025  f9c819e38bae6fcccadb19e6d5dc0194b924b4de758446cfb619c6733f027546
    2,097,152          1,476.831  3809b4ca104c051fbecdf8adf1c7b85e43f2bdf4a54f3a9fe0f6827fdf829b92
    4,194,304          2,951.803  52dcb8edef66f01fcd6a1a399d406bba799b353c8904ffe2206ebed7f366f872
    8,388,608          5,904.344  0b1103d71bf007d8e6308b70fa1c2699957ffd8eb2fb68105342fc20c037e37b
   16,777,216               *-->  Extrapolation:  11,808
   33,554,432               *-->  Extrapolation:  23,616
   67,108,864               *-->  Extrapolation:  47,232
  134,217,728               *-->  Extrapolation:  94,464
  268,435,456               *-->  Extrapolation: 188,928 (more than two days)
  536,870,912               *-->  Extrapolation: 377,856
1,073,741,824               *-->  Extrapolation: 755,712 (about nine days)


Array size : 10,000,000 elements

       Rounds        Elapsed (s)                                                     Hash (SHA256)
            1              0.003  f7c95ec2d5edc4661c3d66f9726282f3befc6596d7fb7c411278cc6bc1b867bf
            2              0.014  c7dd7d0a29dd54b716cd7bd50648316c5f9e8ea779dbad439384350eb44b06b2
            4              0.037  7848881cca4dd109f7d3c5332c0ef59d22d5d949e4c54c0744f43ec74c18bf27
            8              0.059  eeacab6470da127115d1d241f092214bb3ca979ea3c310810c433d64b75ab2c4
           16              0.142  6ba190fc0c23e0edca16ddda1c864c09f7780c12a6008b9ef44c29e4793ab538
           32              0.266  494025d36bccdc8423a309530ae58e35170cfc5c6dabfc64f8ed17b2c29d4f5d
           64              0.570  9a87b4572639785aef28c87f265abb6e8776161cd2220e4feac30f396baa2a16
          128              1.196  a56813198d4d1fc9848a02cb6b276bc2159422a0cce6d0d9cebdb11aa587457d
          256              2.328  1bb1aca5eb7230dda2c3b949fe916b5382a5f4db3d63dccabb4dce5e2858af94
          512              4.612  6b89ccda1d16976e5ef78706b4a0b2f5ceee9f1bd2f4ee239e1fe6ff1ba131e0
        1,024              9.455  f62d09dd8ddbebd9052660b33f864e3201a624f8113d8d0bbafc79fe06b28b54
        2,048             18.981  00b888459bed2d586ea2aa66095c9543f4383e3be7571146a7534807f832a901
        4,096             37.971  a70df557dc5104febab54918c29f2fe32e5b6eb741de54dc9b9c153929f6b710
        8,192             75.608  58ae33b7487febd6f806210e191a736415e292111f533b3cb19ece65cd285870
       16,384            151.125  d02009e5e858b0026ac3d7cccfc2392f852fb52b38797fb6ad3ff567f55d3344
       32,768            302.950  f16d5714bbc29de2423328303542da3276481185750a8e5c2d957c42d0b89ac3
       65,536            606.049  51c3f805a8e87fcaf2d394a381c72a821fcc79879e2da85d04f08044331d7276
      131,072          1,211.297  39a0c6fde176c1a01cf9ebcd3ae5c18e39aab6a9e0d6e8eca3ffd9df31f390f6
      262,144          2,423.513  28f0fae5f453cbe313eddc62d1c010482b1e07693f8a6cc1c33926e95929b98b
      524,288          4,851.429  0cc6cd6b129b21b21a281b3178b2f5192fd8556608a569db00361d3f8092dd90
    1,048,576               *-->  Extrapolation:     9,702
    2,097,152               *-->  Extrapolation:    19,404
    4,194,304               *-->  Extrapolation:    38,808
    8,388,608               *-->  Extrapolation:    77,616
   16,777,216               *-->  Extrapolation:   155,232 (about two days)
   33,554,432               *-->  Extrapolation:   310,464
   67,108,864               *-->  Extrapolation:   620,928 (about one week)
  134,217,728               *-->  Extrapolation: 1,241,856
  268,435,456               *-->  Extrapolation: 2,483,712 (about one month)
  536,870,912               *-->  Extrapolation: 4,967,424
1,073,741,824               *-->  Extrapolation: 9,934,848 (about four months)


Array size : 100,000,000 elements

       Rounds        Elapsed (s)                                                     Hash (SHA256)
            1              0.092  151e39fe153c331587677dadcbbe7d70e2b8d71c3a6691e3b89ac5e718287a47
            2              0.253  87505250156e85dbb89f8728d8ed2ea1c6bd64e27ab544b6d402e38ef1f710e4
            4              0.336  f4c544f12fb55d36dae203b20023fdb3114cbb9625657b8a09258d89959b97b2
            8              0.744  bc9e082a6c1cc773e5783d2a9703860d06be68fbae6d8f76ddd5d0eaf48ba84b
           16              1.473  1028a636e69bf2a920b81fb632e1b40c816c967938683dea9a3b5f02b418ec5a
           32              2.998  43aa5a981a15905229c2ca43cf0b6176364c160b5394c9a767f6e17a35a0fca4
           64              5.843  bed576d60984b6dbecac4852f897e90bc87d9ed595bd4a818367ae473ae5330a
          128             11.688  fd77e56b314dfb3baa0b6af269580d908d675a7c6a287b327de0529908ae0198
          256             23.995  bc2dc20d22edc68b5fb149d941328428bec00e94d1f3b60733a24f72fdcef1a9
          512             47.643  be1f23a307fdfa55648481f9932821339fd291d9ab6c6f5ff92641e341a27259
        1,024             95.298  973023792197d8f127a10fdad4f4fd9e833d8f859f215db9167be7cba348590d
        2,048            190.741  766e6970f7e6e454465faafbce570166454463878dae58861164ff9d32257c40
        4,096            381.089  7b96bc8e43e7f69ce69bed2f881381ba2bd7dc1e37ba32e8e15a224eebe636f4
        8,192            767.318  f25ece1854b8941a6c34de3ea6eb931bb7cf8644ee0c672d31eb8fd0d8e0ac4c
       16,384          1,541.048  0a7681ebf2d82c312c56e3d3e4cd4be61e6080799b9b8cca037e5daecc2df4d8
       32,768          3,097.719  315404e3bbd39a90fa0473fa126e8d30352566f81490704cccd0682ef08c7ffe
       65,536               *-->  Extrapolation:       6,196
      131,072               *-->  Extrapolation:      12,392
      262,144               *-->  Extrapolation:      24,784
      524,288               *-->  Extrapolation:      49,568
    1,048,576               *-->  Extrapolation:      99,136
    2,097,152               *-->  Extrapolation:     198,272 (more than two days)
    4,194,304               *-->  Extrapolation:     396,544
    8,388,608               *-->  Extrapolation:     793,088 (more than one week)
   16,777,216               *-->  Extrapolation:   1,586,176
   33,554,432               *-->  Extrapolation:   3,172,352 (more than a month)
   67,108,864               *-->  Extrapolation:   6,344,704
  134,217,728               *-->  Extrapolation:  12,689,408
  268,435,456               *-->  Extrapolation:  25,378,816 (about ten months)
  536,870,912               *-->  Extrapolation:  50,757,632
1,073,741,824               *-->  Extrapolation: 101,515,264 (more than three years)



Теперь у меня есть два вопроса:

1) Есть ли способ ускорить вставку / удаление элементов - в случайных позициях (не добавляя и не добавляя) - в массивах размера I нужно?

2) Если да, то как?

Спасибо в avance.

1 Ответ

2 голосов
/ 30 января 2020

О вашем первом вопросе

1) Есть ли способ ускорить вставку / удаление элементов - в случайных позициях (ни добавление, ни добавление) - в массивах нужного мне размера?

только один Я могу ответить: да, есть , используя собственный алгоритм, который реализован как в Swift, так и в C ++ .

Замена, в вашем коде:

var array : Array<Int> = Array<Int> ()

на:

var array : StripeArray<Int> = StripeArray<Int> ()

результаты следующие:

Array size : 1,000,000 elements

       Rounds        Elapsed (s)                                                     Hash (SHA256)
            1              0.000  138a3face9a95b3a5ba3f089b58c1e2067541e04fd5605841db62998a543ea29
            2              0.000  5b295b2183d1412143ea243610b5e8e6eb8f7253e7726aab4e840b64281d675a
            4              0.000  bb20a52f6730374c3e37d39b7e8ace180aa46aba3af87a454247c48c9f681e22
            8              0.000  d9f512c044e227d5f3df9343f1af7ec6297bd484c7ffb52b14c8acf9b65ba91b
           16              0.000  bbb1c4838300b3ae70227b4d85ab5de87f0dc75fd08a5bb48120a3703e391087
           32              0.000  f2930403b4ad701d76558eed0ef5a51973f7be7ac641157d7abb0e3c35e75f17
           64              0.001  80cb2479d11e2a83dcedca1f59bf11746fe0f513ee5a79cfb1c2e1f1a036d7bb
          128              0.001  e3c0495d8b2918bb65d1d33e5170ccc0f056b295ea912c1af46b410fc44e9796
          256              0.002  391d7ce33e0fc12f4c14928d55a3e869488a32ad580caf4cfdedbbbe3d7cb44f
          512              0.003  41d4c93d04437531ca1463a61608152369f23a2fbdc25780f2975446b51f857f
        1,024              0.005  f8287bec62c5fd41cdf3cc820f943688c31afc328aff8edf6a8e2a72060448d4
        2,048              0.009  c5de93d9d1c1f449184d46a56796600038a34d39ff97d582b5d6b85a0f5cc970
        4,096              0.017  3691fe4a09aba4a192cd7d1b3d9a99541230df1da0efc956a807d2960c129acf
        8,192              0.032  fcea1f69f59be2826f9894858d0ba0ca66728ab0d6a6bbc6ea2bc3bd7f884e7a
       16,384              0.060  68e40ebd65e232dcfbe8dda1867de2cfaa33cb79a24553dc590b94a6429aa804
       32,768              0.121  6168f321dcdc4e7457c383662b33067e5a70dac17a8c0d32903b801570316963
       65,536              0.248  e5526d34f40a43151b1848e16b203e35b1ba2c05dc104dc8f7394c26480f91f8
      131,072              0.500  cd7e7d27085f74f38800d40a4f6400998c3bf9a01e5dd76da57e6be48e50ceb7
      262,144              0.945  0b263633bd06999866994e2670c0094e63514190aaa2aa7437d9274c98d24dc6
      524,288              1.999  4d990804a9a39e5a31805c54479b669aec670ba10667c36bf7a5821d211e5e45
    1,048,576              3.989  f9c819e38bae6fcccadb19e6d5dc0194b924b4de758446cfb619c6733f027546
    2,097,152              7.891  3809b4ca104c051fbecdf8adf1c7b85e43f2bdf4a54f3a9fe0f6827fdf829b92
    4,194,304             15.938  52dcb8edef66f01fcd6a1a399d406bba799b353c8904ffe2206ebed7f366f872
    8,388,608             32.122  0b1103d71bf007d8e6308b70fa1c2699957ffd8eb2fb68105342fc20c037e37b
   16,777,216             64.380  dc29acbf1aa86925035e69b7c455a53baba83f690e533845a8b502003adc8450
   33,554,432            129.038  9fb6b8485f471547e87eae282dbb4303f52390e88f3ee391de81f1bb342fd89a
   67,108,864            252.159  27f3dcc51ab55b40c9c7bec411c42970004f493fc6435ff1741d04355092837c
  134,217,728            497.752  07875954033e7909343a09bdaf1d300c211a14468e6dbed48ee143cf8d4f30e3
  268,435,456            987.026  6dd13e92d482cab418ce8aaf1248972859f4e107669a582122c20725566693cf
  536,870,912          1,965.029  398bca13e5de89725e3acf30435ff40cdd35a81c0c8c3e32b0fce705849eafc0
1,073,741,824          3,927.479  42897b3575eb945729ebf4db6ec6554e4efa4d0c32c2969d2bde0f9180118a17
Array size : 10,000,000 elements

       Rounds        Elapsed (s)                                                     Hash (SHA256)
            1              0.000  f7c95ec2d5edc4661c3d66f9726282f3befc6596d7fb7c411278cc6bc1b867bf
            2              0.000  c7dd7d0a29dd54b716cd7bd50648316c5f9e8ea779dbad439384350eb44b06b2
            4              0.000  7848881cca4dd109f7d3c5332c0ef59d22d5d949e4c54c0744f43ec74c18bf27
            8              0.000  eeacab6470da127115d1d241f092214bb3ca979ea3c310810c433d64b75ab2c4
           16              0.000  6ba190fc0c23e0edca16ddda1c864c09f7780c12a6008b9ef44c29e4793ab538
           32              0.000  494025d36bccdc8423a309530ae58e35170cfc5c6dabfc64f8ed17b2c29d4f5d
           64              0.001  9a87b4572639785aef28c87f265abb6e8776161cd2220e4feac30f396baa2a16
          128              0.001  a56813198d4d1fc9848a02cb6b276bc2159422a0cce6d0d9cebdb11aa587457d
          256              0.002  1bb1aca5eb7230dda2c3b949fe916b5382a5f4db3d63dccabb4dce5e2858af94
          512              0.003  6b89ccda1d16976e5ef78706b4a0b2f5ceee9f1bd2f4ee239e1fe6ff1ba131e0
        1,024              0.006  f62d09dd8ddbebd9052660b33f864e3201a624f8113d8d0bbafc79fe06b28b54
        2,048              0.011  00b888459bed2d586ea2aa66095c9543f4383e3be7571146a7534807f832a901
        4,096              0.021  a70df557dc5104febab54918c29f2fe32e5b6eb741de54dc9b9c153929f6b710
        8,192              0.041  58ae33b7487febd6f806210e191a736415e292111f533b3cb19ece65cd285870
       16,384              0.079  d02009e5e858b0026ac3d7cccfc2392f852fb52b38797fb6ad3ff567f55d3344
       32,768              0.154  f16d5714bbc29de2423328303542da3276481185750a8e5c2d957c42d0b89ac3
       65,536              0.296  51c3f805a8e87fcaf2d394a381c72a821fcc79879e2da85d04f08044331d7276
      131,072              0.584  39a0c6fde176c1a01cf9ebcd3ae5c18e39aab6a9e0d6e8eca3ffd9df31f390f6
      262,144              1.155  28f0fae5f453cbe313eddc62d1c010482b1e07693f8a6cc1c33926e95929b98b
      524,288              2.255  0cc6cd6b129b21b21a281b3178b2f5192fd8556608a569db00361d3f8092dd90
    1,048,576              4.445  756149d37c140d78f8b4c4f2712fc68ea7772e6d6b7a570ffbff8a0d7feb9536
    2,097,152              8.900  1679c7ab94837dd0b6de25de9f0514ddab59c2f120fde2dd94994d5b6913cfa6
    4,194,304             18.086  92c2c6b3f0ec42f064ead4cb8be16143d176ab8a518158ff2a7647ca108b972d
    8,388,608             37.057  b9f27d2ae85764f614b28763ab5bd008cdc59f01c0c31d05b58396b8f05d76f9
   16,777,216             76.743  e6f60c5fb26fbf9ff03136a414cf27103ed90689bd584748bab4fa3be6d2be56
   33,554,432            161.223  077c729b4faf748469d8ef59cf8292e321c2bb3b1b418df2cdcb6f2dca0896d9
   67,108,864            334.968  1b43867529d0e2044728eacac88f4167f02448ccc73e120f0dce7b942ab3360c
  134,217,728            709.715  7ea104ee3a88f45c412eac5e83e4fa2412e8eab9f5e666fc9b19462053b62437
  268,435,456          1,463.908  792745cc6cb6e062b4fbbd83da45d6a1a6be4c7d0df72c266c884118338489e0
  536,870,912          2,968.155  525880fc64d5d4e3fa413313b6ed8db70d7baef959523dec2aba20a4829b371f
1,073,741,824          5,924.369  c09fb4ef535acfe1d3ac67d34da68ce1fb360f080d0c2af4bae2535b819bd963
Array size : 100,000,000 elements

       Rounds        Elapsed (s)                                                     Hash (SHA256)
            1              0.000  151e39fe153c331587677dadcbbe7d70e2b8d71c3a6691e3b89ac5e718287a47
            2              0.000  87505250156e85dbb89f8728d8ed2ea1c6bd64e27ab544b6d402e38ef1f710e4
            4              0.000  f4c544f12fb55d36dae203b20023fdb3114cbb9625657b8a09258d89959b97b2
            8              0.000  bc9e082a6c1cc773e5783d2a9703860d06be68fbae6d8f76ddd5d0eaf48ba84b
           16              0.000  1028a636e69bf2a920b81fb632e1b40c816c967938683dea9a3b5f02b418ec5a
           32              0.000  43aa5a981a15905229c2ca43cf0b6176364c160b5394c9a767f6e17a35a0fca4
           64              0.001  bed576d60984b6dbecac4852f897e90bc87d9ed595bd4a818367ae473ae5330a
          128              0.001  fd77e56b314dfb3baa0b6af269580d908d675a7c6a287b327de0529908ae0198
          256              0.002  bc2dc20d22edc68b5fb149d941328428bec00e94d1f3b60733a24f72fdcef1a9
          512              0.004  be1f23a307fdfa55648481f9932821339fd291d9ab6c6f5ff92641e341a27259
        1,024              0.008  973023792197d8f127a10fdad4f4fd9e833d8f859f215db9167be7cba348590d
        2,048              0.015  766e6970f7e6e454465faafbce570166454463878dae58861164ff9d32257c40
        4,096              0.030  7b96bc8e43e7f69ce69bed2f881381ba2bd7dc1e37ba32e8e15a224eebe636f4
        8,192              0.058  f25ece1854b8941a6c34de3ea6eb931bb7cf8644ee0c672d31eb8fd0d8e0ac4c
       16,384              0.114  0a7681ebf2d82c312c56e3d3e4cd4be61e6080799b9b8cca037e5daecc2df4d8
       32,768              0.224  315404e3bbd39a90fa0473fa126e8d30352566f81490704cccd0682ef08c7ffe
       65,536              0.439  7958a9d47987cc4b29f8553c1eafb6fe19f9cf11f2ba772b3457be9c3311216c
      131,072              0.861  95a96ec79d7c92e8604142086718c698a2cb34b4aa8124230c46df2a4715a422
      262,144              1.703  40e83d974fb31f9e6f35d8c1814efad5a4faa5fa35c59b6f69a3c30ffb514ea4
      524,288              3.359  b6ae9ea226e172a4996a0b2c89ea83b8376526ae4a9f05c66c1f4c9e30b550de
    1,048,576              6.661  745be68c43083483fc46754af91f7b846f03db9c734eef32829a8b6ec5203234
    2,097,152             13.218  07429d7cc93ede5aa0c4f476a7be9ede5486320f37713af160a683b12e5740a7
    4,194,304             26.257  55d2f463d80c4ed9e1ae5c8ee7d247e47c8e06c70c728b7aab3602197b432476
    8,388,608             52.382  7bbe659baa1ac668ab338b14ff64d49bb8885e3ad6aa887db26392da1475076a
   16,777,216            106.178  6ca8d0b131efcc14d2d2b5824e3000d9a86718912b955f4a4f8bd3d552219469
   33,554,432            218.220  5740bc9a875c5bc7cd609c66e53cf10462ca26a75c7cbf9b640e99059a3706ec
   67,108,864            454.537  ee9b38491cb077502e35db6e5a7565f4e81f9f596913524078ae1cc135ed4fb6
  134,217,728            960.702  c863999ae6b25bcf913e795b1d17f81a7362a966b495ed72498d3e47c56ad99e
  268,435,456          2,069.102  12ae018fb2b8139713512960179172d8f1eae7f795933cdcd0d259cd06748ff9
  536,870,912          4,403.656  23b0927ac1631b5fa757695f16df7a4f03077f037c88a2ff1e99a07e8b737ece
1,073,741,824          9,138.401  d0312a0608dc735fb1ebde9cc9009afdc7bb16c8e5e2c8965c9b73cdcf741bce

Пропорции между производительностью Swift's Arrays и StripeArrays:

+-------------+---------------------+
|    Size     | Array : StripeArray |
+-------------+---------------------+
|   1,000,000 |        192 : 1      |
|  10,000,000 |      1,677 : 1      |
| 100,000,000 |     11,105 : 1      |
+-------------+---------------------+

Я также создал сравнительную таблицу в PDF, между полученными результатами и те, что я получил с StripeArray, доступны по следующей ссылке:

https://www.skyware.eu/StackOverflow/ArrayVsStripeArray.pdf

...