@@ -1466,14 +1466,21 @@ zlib_adler32(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
1466
1466
1467
1467
Py_ssize_t len = data .len ;
1468
1468
uint8_t * buf = data .buf ;
1469
- Py_BEGIN_ALLOW_THREADS
1470
- while ((size_t )len > UINT32_MAX ) {
1471
- value = zng_adler32 (value , buf , UINT32_MAX );
1472
- buf += (size_t ) UINT32_MAX ;
1473
- len -= (size_t ) UINT32_MAX ;
1474
- }
1475
- value = zng_adler32 (value , buf , (uint32_t )len );
1476
- Py_END_ALLOW_THREADS
1469
+
1470
+ /* Do not drop GIL for small values as it increases overhead */
1471
+ if (len > 1024 * 5 ) {
1472
+ Py_BEGIN_ALLOW_THREADS
1473
+ while ((size_t )len > UINT32_MAX ) {
1474
+ value = zng_adler32 (value , buf , UINT32_MAX );
1475
+ buf += (size_t ) UINT32_MAX ;
1476
+ len -= (size_t ) UINT32_MAX ;
1477
+ }
1478
+ value = zng_adler32 (value , buf , (uint32_t )len );
1479
+ Py_END_ALLOW_THREADS
1480
+ } else {
1481
+ value = zng_adler32 (value , buf , (uint32_t )len );
1482
+ }
1483
+
1477
1484
return_value = PyLong_FromUnsignedLong (value & 0xffffffffU );
1478
1485
PyBuffer_Release (& data );
1479
1486
return return_value ;
@@ -1521,14 +1528,21 @@ zlib_crc32(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
1521
1528
1522
1529
Py_ssize_t len = data .len ;
1523
1530
uint8_t * buf = data .buf ;
1524
- Py_BEGIN_ALLOW_THREADS
1525
- while ((size_t )len > UINT32_MAX ) {
1526
- value = zng_crc32 (value , buf , UINT32_MAX );
1527
- buf += (size_t ) UINT32_MAX ;
1528
- len -= (size_t ) UINT32_MAX ;
1529
- }
1530
- value = zng_crc32 (value , buf , (uint32_t )len );
1531
- Py_END_ALLOW_THREADS
1531
+
1532
+ /* Do not drop GIL for small values as it increases overhead */
1533
+ if (len > 1024 * 5 ) {
1534
+ Py_BEGIN_ALLOW_THREADS
1535
+ while ((size_t )len > UINT32_MAX ) {
1536
+ value = zng_crc32 (value , buf , UINT32_MAX );
1537
+ buf += (size_t ) UINT32_MAX ;
1538
+ len -= (size_t ) UINT32_MAX ;
1539
+ }
1540
+ value = zng_crc32 (value , buf , (uint32_t )len );
1541
+ Py_END_ALLOW_THREADS
1542
+ } else {
1543
+ value = zng_crc32 (value , buf , (uint32_t )len );
1544
+ }
1545
+
1532
1546
return_value = PyLong_FromUnsignedLong (value & 0xffffffffU );
1533
1547
PyBuffer_Release (& data );
1534
1548
return return_value ;
0 commit comments