Предположим, для целей этого обсуждения у меня есть такая функция:
PyObject* tuple_from_dict(PyObject* ftype, PyObject* factory, PyObject* values) {
PyObject* ttype = PyTuple_GetItem(factory, 1);
PyObject* fmapping = PyTuple_GetItem(factory, 2);
PyObject* key;
PyObject* value;
Py_ssize_t pos = 0;
Py_ssize_t arg_len = 0;
Py_ssize_t field;
PyObject* result;
if (PyDict_Size(fmapping) == 0) {
result = PyObject_Call(ttype, PyTuple_New(0), NULL);
Py_INCREF(result);
return result;
}
while (PyDict_Next(fmapping, &pos, &key, &value)) {
field = PyLong_AsSsize_t(value);
if (field > arg_len) {
arg_len = field;
}
}
PyObject* args = PyTuple_New(arg_len + 1);
pos = 0;
while (pos < arg_len + 1) {
Py_INCREF(Py_None);
PyTuple_SetItem(args, pos, Py_None);
pos++;
}
pos = 0;
while (PyDict_Next(values, &pos, &key, &value)) {
field = PyLong_AsSsize_t(PyDict_GetItem(fmapping, key));
PyTuple_SetItem(args, field, value);
}
result = PyObject_Call(ttype, args, NULL);
if (result) {
Py_INCREF(result);
}
return result;
}
Не имеет значения, что именно он делает, важно то, что он вызывает PyObject_Call(...)
, чтоЯ подозреваю, что будет медленным.Но медлительность, о которой мы говорим, не будет заметна для каждого вызова (код в целом выполняет пару тысяч вызовов в 1/100 секунды).Итак ... мне нужен агрегат или какой-то способ измерения времени с очень высокой точностью (поэтому, clock_t
не похоже, что это хороший уровень точности).
Все в порядке, если решениебудет работать только на Linux.Это также нормально, если бы я мог как-то замедлить все, но получить более точное измерение рассматриваемого времени.