在一个字中间隔位的快速方法是什么?

2023-12-26

我在64位寄存器的低位有一个32位值;顶部部分是 0。出租X表示一个带有信息的位,并且位从 LSB 到 MSB 列出,如下所示:

X X X  ...  X 0 0 0 0 ... 0

现在,我想用信息“间隔”这些位,这样我就有了

X 0 X 0 X 0 ... X 0

(或者如果你想把 0 放在前面,那么

0 X 0 X 0 X 0 ... X

也很好。)

有什么快速方法可以做到这一点?

与多 CPU 架构相关的答案会很好,但特定于 Intel x86_64 和/或 nVIDIA Pascal SM 的答案将是最相关的。


这被称为莫顿数 https://graphics.stanford.edu/%7Eseander/bithacks.html#InterleaveTableObvious,这是一个具体情况平行展开这反过来又是压缩右在以下问题中

  • 将 32 0/1 值打包到单个 32 位变量的位中的最快方法是什么? https://stackoverflow.com/q/26200961/995714
  • 将屏蔽位移至 lsb https://stackoverflow.com/q/28282869/995714

一种通用的解决方案可能是

uint64_t bit_expand(uint64_t x)
{
    // Input:  00000000ABCDEFGH, each character is a nibble
    x = ((x & 0xFFFF0000) << 32) | ((x & 0x0000FFFF) << 16);
    // Result: ABCD0000EFGH0000
    x = (x & 0xFF000000FF000000) | ((x & 0x00FF000000FF0000) >> 8);
    // Result: AB00CD00EF00GH00
    x = (x & 0xF000F000F000F000) | ((x & 0x0F000F000F000F00) >> 4);
    // Result: A0B0C0D0E0F0G0H0. Each byte: abcd0000
    x = (x & 0xC0C0C0C0C0C0C0C0) | ((x & 0x3030303030303030) >> 2);
    // Result:                   Each byte: ab00cd00
    x = (x & 0x8888888888888888) | ((x & 0x4444444444444444) >> 1);
    // Result:                   Each byte: a0b0c0d0
    return x;
}

然而,常量生成在 RISC 架构上可能效率低下,因为 64 位立即数无法像 x86 那样存储在单个指令中。即使在 x86 上输出组件很长 https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGe1wAyeAyYAHI%2BAEaYxBIArKQADqgKhE4MHt6%2BekkpjgJBIeEsUTFc8XaYDmlCBEzEBBk%2Bfly2mPZ5DDV1BAVhkdFxtrX1jVktCsM9wX3FA2UAlLaoXsTI7BzmAMzByN5YANQmm24T%2BIIAdAhH2CYaAIK3d17BBABskgD6BPsRhB%2BYqgShnQEGegneX32qnm%2BwA9LD9hokcikXcLG4ACLYABiAHEABKPEwAdis932FKhh02GP2UFUhzMr0RqmxbOxKJhRzc3P2mzMXOJbjpEAZ5mZGlUKPZ2K5x15XFe8yOFkparhCLRmJROIJKMearFNLpYqZLLZKKRFstguF9MZEqlGmt0o5yLlN022H2AA5lZtVfD9mikdqNDikXqNAbKUbaaKHebkW7ncn3YchSLTY7U1a03mNB7rvtJP7A5qNBYNG4NBjw6ncRp8dHybHqfHsyya93q72ezXbVnE5LNhpR%2BOx5OJ0WvfsBSqYxS4ybh6ofeuN5ut36M3aE%2BKWZIj8eT6fS9TPd6uGXF/tiJgCCsGFCF/cSRiiW%2BzJssDQQvtsAADWUO5QgxSQICYGEoCgKDVx3bleXPEk90grkzUlZD5WOOcuViHlW3VIj1RQkU0NXAVqR5HDr13Mi4IPSVr3mZU33uNAGAmfYwQIH1IQCOQABUTFiCxFRE2kjkk0lbyAkCwIgxFFgA4DQPAiB9mvUgVPk9TcO0uS1MUzZFlk1SFI00sDPMvTYmUwyLP2JVrN0xTiVMwidKMjS/Rc7z9gATnsmyIK4Qs/IsrgtLM1yIC4AUIvUrgTMS0KrK8yK7KJYkPwDT8nheCFvl%2BAh/kBYEPgEwTQUKz5vmhbKyTuNV70fYhnygHiivmKqRIsfcvWLMwEIw1kJKo3lYiVOjOtqr4eqEvqBsvOdkNG7FxsQnDJD9W8SMzWbwTqhbhNE5ahsLVcNtiSTsOFSRLtIw63mO3qzqNFbFXQx1rtu6jhX5VjmuImaaqO%2Ba3v6j7i3i77zU2u7VsHZ7ush87Z19OHJV%2BiaaKVPa1SesGXohxb3ovYsSyxsabtx4VMdBrrXrJqGKYxx71oR/6KULV8HjfHL8qZyEFCBNYAHkvF4kqFGJvjiqBkkmrVJgpdQfYAFk7lxABJYUpJZH0NAeswNDCjQjZNs25ACAI%2BZVtXNbuIQAGkKQNyUja9i2fe9o2bbtvLPOF74ASBBh0B9GX232D4PgiZ5aEcBh44UAB3JgEneGCtd1twACoIjhrXXZnb13PtykQ/2UWmDWdBJYICxCAUGOw%2BBKOW/zzCwskLhVzuO5LXuIfLUrilWqfOla/rxvm4IVunpnzAG6l%2BfF8RsxS2pmVh%2BHvn3yFubvmXxv3hl4miqhRWZM8yf2unsXMEbzuF/R70t7lbmdqBkGZtPqWr9ZbQ1nF9OmfJ5yeX2naAB0sW7vwpAhRGX0CaUiXk/F%2BF8QHeiUuApSB9BZsTuBwRYtBOCxF4H4DgWhSCoE4DySw1ga7LFWJgRkmweCkAIJoEhiwADWIBTbnC4D6YaPpiRIi4AFWI0jjb6E4JIShPDaGcF4AoEAGguE8MWHAWAMBEAoFQCwBIdBojkEoGgYxpiYh1BYFFU2fA6AEGiOoiAERlG/GYMQAAnpwThli2CCHFgwWgvjqG8CwCwQwwBxDhNIPge8VQABumB1FxIBJUKW6xOEvDaMo2geAIjEDqN4jwWBlEEGIHgFg2i%2BAGGAAoAAangTAadxYJEYH43g/BBAiDEOwKQMhBCKBUOoOJuhNj6GiSgaw1h9CFPUZARYqAEgdDSQAWnFpsfY6yqApOIBEZImB1lMAUCwNRbRKgdBcBHUYzRSCBGmEUEo2RkipAEHc15uQ0i9GeXMVo7RqiTE%2BeMS5VQBBdHqL8/opQhjdBBXCqFTyYUSEWAoFhaw9CVMwNkkh8iOAUNIFQmhdCOB3AAEoa32MAZAyBNJcHOGYOkBSGBeGhHSBhVhLAGXwEQYg7CWj7A8FY%2Bg/KtgmV4Nw8JOikCWJMaK8xEA5XWJAMAexjik4uMoO4uJniSldNIAExgBBgmhOUZE6JsSaEJKuXgFJaSaEZOQFkg1uSyFxIKUUkpZT1g0MqdU2pVB6lNJaW0jpVDOE9OEKIcQgyo0jLUMo3Q8QDBGBmYw7lnrFkQGWastIGytk7L2dEQ5SgTlnIuYC5wEBXAguJA8iO0LZgxFeIkN5HQ61tu%2BfkZFzaQCtoqOCzowLPBNAkPWwdHRIVTEKCigdI7MjNAnZMJtLznLopWJilo2LcWkPIUouJpK1yvHWe8altL6WMo5bM7lAFeUkAFdpYV8rojsLspK2pEBZVGJfWQCgSqf0qoSAkZA7xgABQ1c44gridU0L1T4g1RqgkhLCdazAUSjBWoiXgRJjh7XKKdS67gvA3X5MKcUnxPqKlVJqdKupTAGnNNae0zpxGhnRv6RIaQ8alCJvGSAaQqbjA3psFm%2BAua1mcE2ds3Z%2BzS3HNOecgFtrq21tHWMBt6BV3/JyO89I6n7m6Y6Np2Fk6gXwoM3oMzEKV29peeMBdY6HPdBM6ipYm6BlcPvLu/FhLiW8FJUkNO0Qz13EEslc4Gg6Q0uQEFa9GabB3sIA%2BrYgrn3WPYaWD90r%2BEgHXOcCRZtpGyM2DIre%2BLFGkBqbETR/mVEcDUYIrRdHdEGOVQq/97WBh4FpSIyDWq3EeOCPqtjSGTUofNehy1vrsO4btakgjqhMnONdYIPJHryPeowDNrzAa6NBoYyG5j4aDVRr6bG7jsgE1jJoboMwUy02mAS/MiI2aJP5qk1sytKm/A1tuZZlojzZ19paEZtICKwc9uB/Z5TQ7p0Ius8Olzdn/kTAs4uqztnodzDRRizzO6ul7oJQeklnBj2nskPsHrdKRGRci/FrliXcDJbFd%2BNLgHRXsIFNlrQMrDEirMZ1jnAxiBJPeOs3Y0Tkpm369B7VQ2vFhP8UYwJ42zVxItZhnbNrkkLfSUt51K22OkY216yj23qN7d5/RxjoaWMRu6bIc7AzLvDN4zdnQeghPpsZy9t7tC80CALZsb7Q6bnuAB5p1zoP23g8j5Dhg0fYdTscxpxH06k9o5GJHrPM6Zj2dxx5rF3nCe%2BZJwFzg5KdZCDcOsxpd4xeSBpfsSXRhNKbDp/3CAnK5lJb5Y%2BoVwvWccPmDz3hpAECYCYFgGIOaKu8Gq7V5RpLGvbu0bl4kAVzg%2Bi4MSexAUAqWw0CmzgIeiXL9Uc13nROzDl/q2PlipB9kpGcJIIAA%3D。这是另一种可能的实现,如上所述位摆弄黑客 https://graphics.stanford.edu/%7Eseander/bithacks.html#InterleaveBMN

static const unsigned int B[] = {0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF};
static const unsigned int S[] = {1, 2, 4, 8};

unsigned int x; // Interleave lower 16 bits of x and y, so the bits of x
unsigned int y; // are in the even positions and bits from y in the odd;
unsigned int z; // z gets the resulting 32-bit Morton Number.  
                // x and y must initially be less than 65536.

x = (x | (x << S[3])) & B[3];
x = (x | (x << S[2])) & B[2];
x = (x | (x << S[1])) & B[1];
x = (x | (x << S[0])) & B[0];

y = (y | (y << S[3])) & B[3];
y = (y | (y << S[2])) & B[2];
y = (y | (y << S[1])) & B[1];
y = (y | (y << S[0])) & B[0];

z = x | (y << 1);

A 查找表 https://graphics.stanford.edu/%7Eseander/bithacks.html#InterleaveTableLookup也可以用

#define EXPAND4(a) ((((a) & 0x8) << 4) | (((a) & 0x4) << 2) \
                  | (((a) & 0x2) << 1) | (((a) & 0x1)))

const uint8_t LUT[16] = {
    EXPAND4( 0), EXPAND4( 1), EXPAND4( 2), EXPAND4( 3),
    EXPAND4( 4), EXPAND4( 5), EXPAND4( 6), EXPAND4( 7),
    EXPAND4( 8), EXPAND4( 9), EXPAND4(10), EXPAND4(11),
    EXPAND4(12), EXPAND4(13), EXPAND4(14), EXPAND4(15)
};

output = ((uint64_t)LUT[(x >> 28) & 0xF] << 56) | ((uint64_t)LUT[(x >> 24) & 0xF] << 48)
       | ((uint64_t)LUT[(x >> 20) & 0xF] << 40) | ((uint64_t)LUT[(x >> 16) & 0xF] << 32)
       | ((uint64_t)LUT[(x >> 12) & 0xF] << 24) | ((uint64_t)LUT[(x >>  8) & 0xF] << 16)
       | ((uint64_t)LUT[(x >>  4) & 0xF] <<  8) | ((uint64_t)LUT[(x >>  0) & 0xF] <<  0);

如有必要,可以增加查找表的大小


在 x86 上BMI2 https://en.wikipedia.org/wiki/Bit_Manipulation_Instruction_Sets#Parallel_bit_deposit_and_extract有硬件支持PDEP http://www.felixcloutier.com/x86/PDEP.html可以通过以下内在函数访问指令

output = _pdep_u64(x, 0xaaaaaaaaaaaaaaaaULL);

另一种没有位存储/扩展指令但具有快速乘法器的架构解决方案

uint64_t spaceOut8bits(uint8_t b)
{
    uint64_t MAGIC = 0x8040201008040201;
    uint64_t MASK  = 0x8080808080808080;
    uint64_t expand8bits = htobe64(((MAGIC*b) & MASK) >> 7);
    uint64_t spacedOutBits = expand8bits*0x41041 & 0xAA000000AA000000;
    return (spacedOutBits | (spacedOutBits << 24)) & 0xFFFF000000000000;
}

uint64_t spaceOut64bits(uint64_t x)
{
    return (spaceOut8bits(x >> 24) >>  0)
         | (spaceOut8bits(x >> 16) >> 16)
         | (spaceOut8bits(x >>  8) >> 32)
         | (spaceOut8bits(x >>  0) >> 48);
}

它的工作方式是这样的

  • 第一步扩展输入位 https://stackoverflow.com/q/8461126/995714 from abcdefgh to a0000000 b0000000 c0000000 d0000000 e0000000 f0000000 g0000000 h0000000并存储在expand8bits
  • 然后,我们在下一步中通过乘法和屏蔽将这些间隔开的位移近。在那之后spacedOutBits将包含a0b0c0d0 00000000 00000000 00000000 e0f0g0h0 00000000 00000000 00000000。我们将结果中的两个字节合并在一起

使位更接近的幻数是这样计算的

  a0000000b0000000c0000000d0000000e0000000f0000000g0000000h0000000
×                                              1000001000001000001
  ────────────────────────────────────────────────────────────────
  a0000000b0000000c0000000d0000000e0000000f0000000g0000000h0000000
  00b0000000c0000000d0000000e0000000f0000000g0000000h0000000
+ 0000c0000000d0000000e0000000f0000000g0000000h0000000
  000000d0000000e0000000f0000000g0000000h0000000
  ────────────────────────────────────────────────────────────────
  a0b0c0d0b0c0d0e0c0d0e0f0d0e0f0g0e0f0g0h0f0g0h000g0h00000h0000000
& 1010101000000000000000000000000010101010000000000000000000000000
  ────────────────────────────────────────────────────────────────
  a0b0c0d0000000000000000000000000e0f0g0h0000000000000000000000000

可以看到输出组件here https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGe1wAyeAyYAHI%2BAEaYxBIArKQADqgKhE4MHt6%2BekkpjgJBIeEsUTFc8XaYDmlCBEzEBBk%2Bfly2mPZ5DDV1BAVhkdFxtrX1jVktCsM9wX3FA2UAlLaoXsTI7BzmAMzByN5YANQmm24T%2BIIAdAhH2CYaAIK3d17BBABskgD6BPsRhB%2BYqgShnQEGegneX32qnm%2BwA9LD9hokcikXcLG4ACLYABiAHEABKPEwAdis932FKhh02GP2UFUhzMr0RqmxbOxKJhRzc3P2mzMXOJbjpEAZ5mZGlUKPZ2K5x15XFe8yOFkparhCLRmJROIJKMearFNLpYqZLLZKKRFstguF9MZEqlGmt0o5yLlN022H2AA5lZtVfD9mikdqNDikXqNAbKUbaaKHebkW7ncn3YchSLTY7U1a03mNB7rvtJP7A5qNBYNG4NBjw6ncRp8dHybHqfHsyya93q72ezXbVnE5LNhpR%2BOx5OJ0WvfsBSqYxS4ybh6ofeuN5ut36M3aE%2BKWZIj8eT6fS9TPd6uGXF/tiJgCCsGFCF/cSRiiW%2BzJssDQQvtsAADWUO5QgxSQICYGEoCgKDVx3bleXPEk90grkzUlZD5WOOcuViHlW3VIj1RQkU0NXAVqR5HDr13Mi4IPSVr3mZU33uNAGAmfYwQIH1IQCOQABUTFiCxFRE2kjkk0lbyAkCwIgxFFgA4DQPAiB9mvUgVPk9TcO0uS1MUzZFlk1SFI00sDPMvTYmUwyLP2JVrN0xTiVMwidKMjS/Rc7z9gATnsmyIK4Qs/IsrgtLM1yIC4AUIvUrgTMS0KrK8yK7KJYkPwDT8nheCFvl%2BAh/kBYEPgEwTQUKz5vmhbKyTuNV70fYhnygHiivmKqRIsfcvWLMwEIw1kJKo3lYiVOjOtqr4eqEvqBsvOdkNG7FxsQnDJD9W8SMzWbwTqhbhNE5ahsLVcNtiSTsOFSRLtIw63mO3qzqNFbFXQx1rtu6jhX5VjmuImaaqO%2Ba3v6j7i3i77zU2u7VsHZ7ush87Z19OHJV%2BiaaKVPa1SesGXohxb3ovYsSyxsabtx4VMdBrrXrJqGKYxx71oR/6KULV8HjfHL8qZyEFCBNYAHkvF4kqFGJvjiqBkkmrVJgpdQfYAFk7lxABJYUpJZH0NAeswNDCjQjZNs25ACAI%2BZVtXNbuIQAGkKQNyUja9i2fe9o2bbtvLPOF74ASBBh0B9GX232D4PgiZ5aEcBh44UAB3JgEneGCtd1twACoIjhrXXZnb13PtykQ/2UWmDWdBJYICxCAUGOw%2BBKOW/zzCwskLhVzuO5LXuIfLUrilWqfOla/rxvm4IVunpnzAG6l%2BfF8RsxS2pmVh%2BHvn3yFubvmXxv3hl4miqhRWZM8yf2unsXMEbzuF/R70t7lbmdqBkGZtPqWr9ZbQ1nF9OmfJ5yeX2naAB0sW7vwpAhRGX0CaUiXk/F%2BF8QHeiUuApSB9BZsTuBwRYtBOCxF4H4DgWhSCoE4DySw1ga7LFWJgRkmweCkAIJoEhiwADWIBTbnC4D6YaPpiRIi4AFWI0jjb6E4JIShPDaGcF4AoEAGguE8MWHAWAMBEAoFQCwBIdBojkEoGgYxpiYh1BYFFU2fA6AEGiOoiAERlG/GYMQAAnpwThli2CCHFgwWgvjqG8CwCwQwwBxDhNIPge8VQABumB1FxIBJUKW6xOEvDaMo2geAIjEDqN4jwWBlEEGIHgFg2i%2BAGGAAoAAangTAadxYJEYH43g/BBAiDEOwKQMhBCKBUOoOJuhNj6GiSgaw1h9CFPUZARYqAEgdDSQAWnFpsfY6yqApOIBEZImB1lMAUCwNRbRKgdBcBHUYzRSCBGmEUEo2RkipAEHc15uQ0i9GeXMVo7RqiTE%2BeMS5VQBBdHqL8/opQhjdBBXCqFTyYUSEWAoFhaw9CVMwNkkh8iOAUNIFQmhdCOB3AAEoa32MAZAyBNJcHOGYOkBSGBeGhHSBhVhLAGXwEQYg7CWj7A8FY%2Bg/KtgmV4Nw8JOikCWJMaK8xEA5XWJAMAexjik4uMoO4uJniSldNIAExgBBgmhOUZE6JsSaEJKuXgFJaSaEZOQFkg1uSyFxIKUUkpZT1g0MqdU2pVB6lNJaW0jpVDOE9OEKIcQgyo0jLUMo3Q8QDBGBmYw7lnrFkQGWastIGytk7L2dEQ5SgTlnIuYC5wEBXAguJA8iO0LZgxFeIkN5HQ61tu%2BfkZFzaQCtoqOCzowLPBNAkPWwdHRIVTEKCigdI7MjNAnZMJtLznLopWJilo2LcWkPIUouJpK1yvHWe8altL6WMo5bM7lAFeUkAFdpYV8rojsLspK2pEBZVGJfWQCgSqf0qoSAkZA7xgABQ1c44gridU0L1T4g1RqgkhLCdazAUSjBWoiXgRJjh7XKKdS67gvA3X5MKcUnxPqKlVJqdKupTAGnNNae0zpxGhnRv6RIaQ8alCJvGSAaQqbjA3psFm%2BAua1mcE2ds3Z%2BzS3HNOecgFtrq21tHWMBt6BV3/JyO89I6n7m6Y6Np2Fk6gXwoM3oMzEKV29peeMBdY6HPdBM6ipYm6BlcPvLu/FhLiW8FJUkNO0Qz13EEslc4Gg6Q0uQEFa9GabB3sIA%2BrYgrn3WPYaWD90r%2BEgHXOcCRZtpGyM2DIre%2BLFGkBqbETR/mVEcDUYIrRdHdEGOVQq/97WBh4FpSIyDWq3EeOCPqtjSGTUofNehy1vrsO4btakgjqhMnONdYIPJHryPeowDNrzAa6NBoYyG5j4aDVRr6bG7jsgE1jJoboMwUy02mAS/MiI2aJP5qk1sytKm/A1tuZZlojzZ19paEZtICKwc9uB/Z5TQ7p0Ius8Olzdn/kTAs4uqztnodzDRRizzO6ul7oJQeklnBj2nskPsHrdKRGRci/FrliXcDJbFd%2BNLgHRXsIFNlrQMrDEirMZ1jnAxiBJPeOs3Y0Tkpm369B7VQ2vFhP8UYwJ42zVxItZhnbNrkkLfSUt51K22OkY216yj23qN7d5/RxjoaWMRu6bIc7AzLvDN4zdnQeghPpsZy9t7tC80CALZsb7Q6bnuAB5p1zoP23g8j5Dhg0fYdTscxpxH06k9o5GJHrPM6Zj2dxx5rF3nCe%2BZJwFzg5KdZCDcOsxpd4xeSBpfsSXRhNKbDp/3CAnK5lJb5Y%2BoVwvWccPmDz3hpAECYCYFgGIOaKu8Gq7V5RpLGvbu0bl4kAVzg%2Bi4MSexAUAqWw0CmzgIeiXL9Uc13nROzDl/q2PlipB9kpGcJIIAA%3D。您可以更改编译器以查看它在各种架构上的完成情况

还有一种替代方法位摆弄黑客 https://graphics.stanford.edu/%7Eseander/bithacks.html#Interleave64bitOps page

z = ((x * 0x0101010101010101ULL & 0x8040201008040201ULL) * 
     0x0102040810204081ULL >> 49) & 0x5555 |
    ((y * 0x0101010101010101ULL & 0x8040201008040201ULL) * 
     0x0102040810204081ULL >> 48) & 0xAAAA;

更多解决方案可以在不使用 BMI2 的 PDEP 便携式高效替代品? https://stackoverflow.com/q/38938911/995714

有关的:如何对像素数据进行位条纹? https://stackoverflow.com/q/36256537/995714

正如您所看到的,如果没有位存储指令,操作将非常复杂。如果您不进行像这样的位条带化操作,那么最好使用 SIMD 并行执行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在一个字中间隔位的快速方法是什么? 的相关文章

  • 在Python中复制字典的快速方法

    我有一个经常与字典一起使用的Python 程序 我必须把字典复印数千次 我需要密钥和相关内容的副本 副本将被编辑 并且不得链接到原始文件 例如 副本中的更改不得影响原始文件 键是字符串 值是整数 0 1 我目前使用一个简单的方法 newDi
  • 长 IN 子句是代码异味吗?

    简单的问题 想知道长 IN 子句是否有代码味道 我真的不知道如何证明它的合理性 除了我认为的味道之外 我无法解释为什么它有味道 select name code capital population flower bird from us
  • 真实文件对象比 StringIO 和 cStringIO 慢?

    StringIO其代码中有以下注释 Notes Using a real file is often faster but less convenient There s also a much faster implementation
  • Postgres 服务器性能在达到一定数量的记录后急剧下降

    我正在使用游标从大型 postgres 表中检索记录 4亿条记录 使用子表对数据进行分区 我的游标定义为 select from parent table order by indexed column 同时使用 JDBC 和 psql 前
  • 在 Java 中,对复杂模型使用接口是否会带来性能提升?

    标题很难理解 但我不知道如何以另一种方式总结 欢迎任何澄清的编辑 我被告知并建议使用接口来提高性能 即使在并不特别需要常规 接口 角色的情况下也是如此 在这种情况下 对象是大模型 MVC 意义上的 具有许多方法和字段 向我推荐的 好用处 是
  • 如何从 Hudson CI API 获得更好的性能?

    我正在尝试为自己编写一个与 Hudson 构建服务器集成的小工具 我目前遇到的障碍是性能 我想做一件简单的事情 比如列出所有作业和上次成功构建的时间 hudson API 提供了此信息 但我要么必须查询所有内容depth 2或者单独查询每个
  • 更改为通用接口对性能的影响

    我使用 Visual Studio 使用 C NET 开发应用程序 ReSharper 在我的方法原型中经常建议我用更通用的类型替换输入参数的类型 例如 如果我仅在方法主体中使用带有 foreach 的列表 则使用 List 和 IEnum
  • RMI 有多快?

    我看到过这样的问题 两个独立的 Java 桌面应用程序之间的通信 https stackoverflow com questions 1680898 communication between two separate java deskt
  • 有效地从 2 个数据帧中查找日期时间范围的重叠

    关于查找日期或时间范围的重叠存在一些问题 例如 https stackoverflow com questions 9044084 efficient date range overlap calculation in python 我用这
  • 如何加快编辑距离计算速度

    我正在尝试运行模拟来测试平均值编辑距离 http en wikipedia org wiki Levenshtein distance之间随机 二进制字符串 我的程序是用 python 编写的 但我正在使用这个C扩展 https githu
  • ElasticSearch 匹配多个前缀术语

    我试图为 ElasticSearch 提供一个包含多个术语的查询 然后给出匹配的文档 其中指定的术语位于目标字段中的任何位置 这些术语可以是完整的单词或单词前缀 示例文档 msg 你好 我是一条短信 示例查询字符串 你好消息 你好 和 消息
  • 按类型进行弹簧接线比按名称接线要慢很多

    在我的项目中 我试图迁移 Foo foo Foo beanFactory getBean name into Foo foo beanFactory getBean Foo class 好处是显而易见的 类型安全 更少复杂的代码 更少无用的
  • 慢 Eclipse Spring STS 插件

    我是 Spring 新手 安装了 Eclipse STS 插件 使用服务似乎非常慢 CPU 使用率激增 笔记本电脑只会变热 实际上风扇就像喷气发动机一样运行 直接响应服务的启动 停止 虽然下面的内容确实为我解决了 Spring STS 的所
  • 空 while 循环有什么影响?

    我知道这可能是一个有点 愚蠢 的问题 但有时 我只想循环直到条件为假 但我不喜欢让循环保持为空 所以代替 Visible true while IsRunning Visible false 我通常prefer while IsRunnin
  • 为什么 Android Eclipse 不断刷新外部文件夹并花费很长时间?

    我只有一部新的 Android 手机 我一直在修补一些基本的应用程序 每当我保存任何内容时 Eclipse 的 Android 插件就会刷新外部文件夹 这让我抓狂 通常我不会介意 但当需要 10 秒才能刷新时 我开始注意到 我已经搜索过 其
  • C# 写入文件的性能

    我的情况概述 我的任务是从文件中读取字符串 并将它们重新格式化为更有用的格式 重新格式化输入后 我必须将其写入输出文件 这是必须完成的操作的示例 文件行示例 ANO 2010 CPF 17834368168 YEARS 2010 2009
  • 从视频创建缩略图 - 提高速度性能 - AVAsset - iPhone [重复]

    这个问题在这里已经有答案了 我正在使用基于以下线程中的代码的代码来生成视频缩略图 从 iPhone SDK 中的视频 URL 或数据获取缩略图 https stackoverflow com questions 1347562 gettin
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • .NET 中 UniqueQueue 和 UniqueReplacementQueue 集合最有效的实现

    考虑到入队和出队操作的速度同样重要 NET 中 UniqueQueue 和 UniqueReplacementQueue 集合最有效 就速度而言 的实现是什么 UniqueQueue是一个不可能出现重复的队列 因此 如果我将一个元素推送到队
  • 有谁知道一种更快的方法来执行 String.Split() 吗?

    我正在读取 CSV 文件的每一行 并且需要获取每一列中的各个值 所以现在我只是使用 values line Split delimiter where line是保存由分隔符分隔的值的字符串 衡量我的表现ReadNextRow我注意到它花费

随机推荐

  • 如何在谷歌地图 API v3 中一次仅显示一个信息窗口

    我们可以在谷歌地图中一次仅显示一个信息窗口 并为多个标记显示多个信息窗口吗 意味着 当我单击标记时隐藏 关闭其他信息窗口并仅显示当前标记信息窗口 Thanks 我解决的方法如下 var infoWindowsOpenCurrently A
  • C# 在方法或事件处理程序之间传递变量

    我仍在尝试学习 c 我的问题是如何将变量从 Item1 Click 传递到 Item2 Click 这与在方法之间传递它们是同一件事还是因为它们是事件处理程序而有所不同 public partial class Events System
  • K&R 第 2 版,示例 1.9 字符数组

    我对以下代码中的 getline 函数和参数定义有疑问 代码直接取自 K R 第 1 9 章 字符数组 我已将其逐字复制在这里 问题是 当我按原样编译程序时 出现三个错误 我在最后重现了这些错误 当我在出现错误的三个地方将函数和函数参数定义
  • 从 sql 修改 SSIS 目录中的连接管理器信息

    有没有办法在使用 sql 代码部署后从 ssis 目录更新连接管理器信息 我想先部署没有敏感数据的项目 执行目录 deploy project 然后通过 SQL 将用户名和密码添加到 SSIS 目录项目 有没有办法从以下位置更新连接管理器信
  • 空间域图像卷积

    我正在尝试复制结果这个链接 https stackoverflow com q 38709810 159072 using linear卷积于空间域 图像首先转换为二维double数组 然后进行卷积 图像和内核大小相同 图像在卷积之前进行填
  • 加快用最后一个非 Nan 值替换 NaN

    我想用最后一个非 NaN 值替换向量中的所有 NaN input 1 2 3 NaN NaN 2 output 1 2 3 3 3 2 我想尝试加快已有的循环速度 input 1 2 3 NaN NaN 2 if isnan input 1
  • 单击 Angular 网页中的 TableRow 时出现 StaleElementException

    div class row gridrow clickable ng scope i class col m1 s1 tiny fa fa male i div class col m3 s11 ng binding Allard div
  • 如何删除MySQL中的记录并保留最新日期

    Example table 1 ID Email Answer UpdateDate 1 email protected cdn cgi l email protection 1 2011 07 02 2 email protected c
  • Webpack 错误:configuration.module.rules[0] 有一个未知的属性“query”

    我正在关注这个教程 https www youtube com watch v iWUR04B42Hc https www youtube com watch v iWUR04B42Hc 我知道它的内容已过时 但我认为已将其正确翻译为最新版
  • ASP.Net 移动 Web 表单发生了什么?

    以前 Visual Studio 具有用于移动 Web 表单 而不是移动 SDK 的模板 它们似乎在 Visual Studio 2008 中消失了 我见过的唯一解决方案是从 Omar 下载一些模板 http blogs msdn com
  • Pandas hub_table,按列对值进行排序

    我是 Pandas 的新用户 我喜欢它 我正在尝试在 Pandas 中创建一个数据透视表 一旦我按照我想要的方式获得了数据透视表 我想按列对值进行排名 我附上了 Excel 中的图像 因为以表格格式更容易看到我想要实现的目标 链接到图像 h
  • 找到使图像在列表中唯一的像素,您可以改进暴力破解吗?

    假设我有一个字符串列表 其中每个字符串是 正好 4 个字符长并且 在列表中是唯一的 对于每个字符串 我想确定字符串中使该字符串唯一的字符的位置 所以对于三个字符串的列表 abcd abcc bbcb 对于第一个字符串 我想识别第四个位置的字
  • Windows 7 64 位中的递归

    我有这个助手类 public static class DateTimeHelper public static int GetMonthDiffrence DateTime date1 DateTime date2 if date1 gt
  • 在 QML 中检测按下并按住按钮

    我想在用户按下并按住按钮时打开上下文菜单 为了方便起见 我使用按钮 如果我做 Button text model ualabel MouseArea preventStealing true anchors fill parent onPr
  • 如何限制javafx文本字段的字符数

    我正在使用 FXML 来设置表单 但我需要设置文本字段中的字符限制 我怎样才能做到这一点 您不能直接设置字符数限制 但你可以添加一个listener to lengthProperty 文本字段的 import javafx applica
  • realloc() 的性能影响

    我有一个记录列表 一开始我不知道记录数 我需要将它们读入数组 那么 是否建议一一读取所有记录并一一进行 realloc 并在元素到来时继续增加数组大小 或者我应该花一次来识别记录数并仅进行一次 malloc 哪一个的计算成本会更低 A re
  • Xcode - 如何以编程方式在容器视图中嵌入/更改视图控制器?

    我正在尝试以编程方式设置 或更改嵌入的视图控制器里面一个控制器视图 我有 3 个不同的视图控制器 我想在容器视图中显示它们 所有这些都取决于用户是否登录 我环顾四周并尝试了一堆代码 我发现一个有效 但代码改变了自身视图 而不是视图容器视图
  • python distutils 不包含 SWIG 生成的模块

    我正在使用 distutils 从我的项目创建 rpm 我有这个目录树 project my module data file dat my module1 py my module2 py src header1 h header2 h
  • 如何使用 PHP 创建 Odata 服务?

    我使用的是 Kendo UI 在这个框架中我们可以使用 ODATA JSON P JSON 读取数据 我们使用 json encode 成功开发了 JSON P 和 PHP 中的 JSON 数据 但我们无法使用 PHP 创建 ODATA 我
  • 在一个字中间隔位的快速方法是什么?

    我在64位寄存器的低位有一个32位值 顶部部分是 0 出租X表示一个带有信息的位 并且位从 LSB 到 MSB 列出 如下所示 X X X X 0 0 0 0 0 现在 我想用信息 间隔 这些位 这样我就有了 X 0 X 0 X 0 X 0