我需要使用巨大的数组(超过十亿个项目),在其中存储大数据的(无序)索引(以 PB 为单位,存储在 SSD 矩阵上)。
数组的大小变化不大(最大 10-15%),但需要对其进行许多插入/删除操作。
通过一些测试,我发现即使对于较小的尺寸(1000 万个元素),速度也很慢,最初我将其归因于 SSD Controller 的不正确调整。
在研究瓶颈时,我编写了一些软件来确定问题出在哪里。
我在 insert(_:at:) 和 remove(at:) 函数中找到了它(既适用于 Array 也适用于 连续数组)。
为了验证问题有多严重,我编写了一个基准程序,检查在随机位置上增加“删除/插入”对所花费的时间(对于 1、10 和 1 亿个元素的数组)。
为了能够重现测试,我从适当播种的随机数生成器中获取要操作的数据(以及进行删除和插入的位置)。
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)有没有办法加快元素的插入/删除速度 - 在随机位置(既不附加也不前置) - 在我需要的大小的数组中?
2)如果是这样,怎么做?
提前致谢。
最佳答案
关于您的第一问题
1) Is there a way to speed up the insertion/removal of elements - in random positions (neither appending nor prepending) - in arrays of the size I need?
唯一我可以回答:是的,使用在 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 的 Arrays 和 StripeArrays 性能之间的比例是:
+-------------+---------------------+
| Size | Array : StripeArray |
+-------------+---------------------+
| 1,000,000 | 192 : 1 |
| 10,000,000 | 1,677 : 1 |
| 100,000,000 | 11,105 : 1 |
+-------------+---------------------+
我还制作了一个 PDF 格式的比较图表,显示您获得的结果与我使用 StripeArray 获得的结果之间的关系,可通过以下链接获取:
关于arrays - Swift 数组随机插入和删除非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59930328/