Расширение Profiling C, которое вызывает Python - PullRequest
0 голосов
/ 28 мая 2018

Предположим, для целей этого обсуждения у меня есть такая функция:

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.Это также нормально, если бы я мог как-то замедлить все, но получить более точное измерение рассматриваемого времени.

1 Ответ

0 голосов
/ 28 мая 2018

Полезно ли clock_gettime()?Это интерфейс POSIX для таймера высокого разрешения. В этом посте приведен пример использования.

#include <iostream>
#include <time.h>
using namespace std;

timespec diff(timespec start, timespec end);

int main()
{
    timespec time1, time2;
    int temp;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
    for (int i = 0; i< 242000000; i++)
        temp+=temp;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
    cout<<diff(time1,time2).tv_sec<<":"<<diff(time1,time2).tv_nsec<<endl;
    return 0;
}

timespec diff(timespec start, timespec end)
{
    timespec temp;
    if ((end.tv_nsec-start.tv_nsec)<0) {
        temp.tv_sec = end.tv_sec-start.tv_sec-1;
        temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
    } else {
        temp.tv_sec = end.tv_sec-start.tv_sec;
        temp.tv_nsec = end.tv_nsec-start.tv_nsec;
    }
    return temp;
}
...