Skip to content

Commit d08ad50

Browse files
Test which code runs faster: call a sysconf or parse cpuinfo
1 parent dd209d0 commit d08ad50

File tree

5 files changed

+88
-5
lines changed

5 files changed

+88
-5
lines changed

src/python-zstd.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,28 @@ static PyObject *py_zstd_threads_count(PyObject* self, PyObject *args)
600600
return Py_BuildValue("i", threads);
601601
}
602602

603+
/**
604+
* Returns ZSTD determined cpu count, int
605+
*/
606+
static PyObject *py_zstd_cpu_count_sysconf(PyObject* self, PyObject *args)
607+
{
608+
UNUSED(self);
609+
UNUSED(args);
610+
int32_t threads = UTIL_countAvailableCores_posix_sysconf();
611+
return Py_BuildValue("i", threads);
612+
}
613+
614+
/**
615+
* Returns ZSTD determined cpu count, int
616+
*/
617+
static PyObject *py_zstd_cpu_count_cpuinfo(PyObject* self, PyObject *args)
618+
{
619+
UNUSED(self);
620+
UNUSED(args);
621+
int32_t threads = UTIL_countAvailableCores_parse_cpuinfo();
622+
return Py_BuildValue("i", threads);
623+
}
624+
603625
static PyObject *py_zstd_set_cpu_cores_cache_ttl(PyObject* self, PyObject *args)
604626
{
605627
UNUSED(self);
@@ -697,6 +719,8 @@ static PyMethodDef ZstdMethods[] = {
697719
{"ZSTD_version_loaded", py_zstd_library_version_loaded, METH_NOARGS, NULL},
698720
{"ZSTD_version_number", py_zstd_library_version_int, METH_NOARGS, ZSTD_INT_VERSION_DOCSTRING},
699721
{"ZSTD_threads_count", py_zstd_threads_count, METH_NOARGS, ZSTD_THREADS_COUNT_DOCSTRING},
722+
{"ZSTD_cpu_count_sysconf", py_zstd_cpu_count_sysconf, METH_NOARGS, ZSTD_THREADS_COUNT_DOCSTRING},
723+
{"ZSTD_cpu_count_cpuinfo", py_zstd_cpu_count_cpuinfo, METH_NOARGS, ZSTD_THREADS_COUNT_DOCSTRING},
700724
{"ZSTD_max_threads_count", py_zstd_max_threads_count, METH_NOARGS, ZSTD_MAX_THREADS_COUNT_DOCSTRING},
701725
{"ZSTD_min_compression_level", py_zstd_min_compression_level, METH_NOARGS, ZSTD_MIN_COMPRESSION_LEVEL_DOCSTRING},
702726
{"ZSTD_max_compression_level", py_zstd_max_compression_level, METH_NOARGS, ZSTD_MAX_COMPRESSION_LEVEL_DOCSTRING},

src/util.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,9 @@ int UTIL_countAvailableCores(void)
142142

143143
#elif defined(__linux__)
144144

145-
/* parse /proc/cpuinfo
146-
* siblings / cpu cores should give hyperthreading ratio
147-
* otherwise fall back on sysconf */
148-
int UTIL_countAvailableCores(void)
145+
/*
146+
* Use only posix sysconf */
147+
int UTIL_countAvailableCores_posix_sysconf(void)
149148
{
150149
time_t currTime = time(NULL);
151150
if (lastTimeCached && currTime-lastTimeCached>util_cpuCoresCacheTTL) numLogicalCores = 0;
@@ -158,11 +157,25 @@ int UTIL_countAvailableCores(void)
158157
numLogicalCores = (int)sysconf(_SC_NPROCESSORS_ONLN);
159158
if (numLogicalCores == -1) {
160159
/* value not queryable, fall back on 1 */
160+
numLogicalCores = 1;
161161
printdn("Sysconf read fail. numLogicalCores: %d\n", numLogicalCores);
162162
lastTimeCached = time(NULL);
163-
return numLogicalCores = 1;
163+
return numLogicalCores;
164164
}
165165
printdn("Sysconf readed. numLogicalCores: %d\n", numLogicalCores);
166+
}
167+
/* Only parse /proc/cpuinfo
168+
* siblings / cpu cores should give hyperthreading ratio
169+
* otherwise fall back to 1 */
170+
int UTIL_countAvailableCores_parse_cpuinfo(void)
171+
{
172+
time_t currTime = time(NULL);
173+
if (lastTimeCached && currTime-lastTimeCached>util_cpuCoresCacheTTL) numLogicalCores = 0;
174+
175+
if (numLogicalCores != 0) {
176+
printdn("Stored static numLogicalCores: %d\n", numLogicalCores);
177+
return numLogicalCores;
178+
}
166179

167180
/* try to determine if there's hyperthreading */
168181
{ FILE* cpuinfo = fopen("/proc/cpuinfo", "r");

src/util.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,12 @@ __attribute__((unused)) static int numLogicalCores = 1;
7575
__attribute__((unused)) static time_t lastTimeCached = 0;
7676
__attribute__((unused)) static int util_cpuCoresCacheTTL = 60;
7777
#endif
78+
#if defined(__linux__)
79+
int UTIL_countAvailableCores_posix_sysconf(void);
80+
int UTIL_countAvailableCores_prse_cpuinfo(void);
81+
#else
7882
int UTIL_countAvailableCores(void);
83+
#endif
7984
int UTIL_setCpuCoresCacheTTL(int cacheTTL);
8085
int UTIL_stopCpuCoresCache(void);
8186

tests/base.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ def raise_skip(msg):
2727
log.info("libzstd built with legacy formats support: %r"% zstd.ZSTD_legacy_support())
2828
log.info("zstd max number of threads: %r"% zstd.ZSTD_max_threads_count())
2929
log.info("zstd found CPU cores : %r"% zstd.ZSTD_threads_count())
30+
log.info("zstd found CPU cores (call sysconf) : %r"% zstd.ZSTD_cpu_count_sysconf())
31+
log.info("zstd found CPU cores (parse cpuinfo) : %r"% zstd.ZSTD_cpu_count_cpuinfo())
3032
log.info("zstd default compression level: %r"% zstd.ZSTD_default_compression_level())
3133
log.info("zstd max compression level: %r"% zstd.ZSTD_max_compression_level())
3234
log.info("zstd min compression level: %r"% zstd.ZSTD_min_compression_level())

tests/test_speed.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,45 @@ def test_cpu_cores_cache_none_speed(self):
261261
log.info("Check cache use speed(0) average = %6.2f Ops/sec" % (1.0*ops/wait,))
262262
log.info("diff Check memory usage = %6.2f kb" % (1.0*(endMemoryUsage-beginMemoryUsage)/1024,))
263263

264+
def test_cpu_cores_cache_none_sysconf_speed(self):
265+
wait = 10
266+
if "ZSTD_FULLTIME_TESTS" in os.environ:
267+
wait = 70
268+
log.info("\nWait %d seconds..." % wait)
269+
ops = 0
270+
tbegin = time()
271+
beginMemoryUsage=get_real_memory_usage()
272+
zstd.ZSTD_stopCpuCoresCache()
273+
log.info("begin Check memory usage= %6.2f kb" % (1.0*beginMemoryUsage/1024,))
274+
while time()-tbegin<wait:
275+
cores = zstd.ZSTD_cpu_count_sysconf()
276+
ops+=1
277+
278+
endMemoryUsage=get_real_memory_usage()
279+
log.info("end Check memory usage = %6.2f kb" % (1.0*endMemoryUsage/1024,))
280+
log.info("Check cache use speed(0) average = %6.2f Ops/sec" % (1.0*ops/wait,))
281+
log.info("diff Check memory usage = %6.2f kb" % (1.0*(endMemoryUsage-beginMemoryUsage)/1024,))
282+
283+
284+
def test_cpu_cores_cache_none_cpuinfo_speed(self):
285+
wait = 10
286+
if "ZSTD_FULLTIME_TESTS" in os.environ:
287+
wait = 70
288+
log.info("\nWait %d seconds..." % wait)
289+
ops = 0
290+
tbegin = time()
291+
beginMemoryUsage=get_real_memory_usage()
292+
zstd.ZSTD_stopCpuCoresCache()
293+
log.info("begin Check memory usage= %6.2f kb" % (1.0*beginMemoryUsage/1024,))
294+
while time()-tbegin<wait:
295+
cores = zstd.ZSTD_cpu_count_cpuinfo()
296+
ops+=1
297+
298+
endMemoryUsage=get_real_memory_usage()
299+
log.info("end Check memory usage = %6.2f kb" % (1.0*endMemoryUsage/1024,))
300+
log.info("Check cache use speed(0) average = %6.2f Ops/sec" % (1.0*ops/wait,))
301+
log.info("diff Check memory usage = %6.2f kb" % (1.0*(endMemoryUsage-beginMemoryUsage)/1024,))
302+
264303
def test_cpu_cores_cache_60_speed(self):
265304
wait = 10
266305
if "ZSTD_FULLTIME_TESTS" in os.environ:

0 commit comments

Comments
 (0)