Измерьте накладные расходы без pthread в C - PullRequest
0 голосов
/ 06 февраля 2019

Я хотел бы поделиться тестовым вопросом, с которым я недавно встречался, и обсудить его:

Написать программу на C, которая приблизительно измеряет издержки переключения контекста> между ядром и пользовательским пространством в UNIX/ Система Linux (без использования> pthread API).Пожалуйста, укажите предположения, на которых основана ваша грубая оценка>.

Я хотел бы обсудить с более продвинутыми программистами C различные варианты этой проблемы.

У меня ограниченные знания в программировании на C, и я задокументировал себя, чтобы дать приемлемый ответ:

https://eli.thegreenplace.net/2018/measuring-context-switching-and-memory-overheads-for-linux-threads/

https://www.researchgate.net/post/How_can_I_measure_thread_creation_and_destruction

https://github.com/eliben/code-for-blog/blob/master/2018/threadoverhead/thread-pipe-msgpersec.c

Я быстро понял, несмотря на свои ограниченные знания, двусмысленность вопроса.Действительно, вопрос не предусматривает, должен ли быть дан ответ в единицах времени или памяти.

Я лично решил разработать свое время для измерения с помощью библиотеки time.h и очень простого фрагмента.Результат должен быть разделен на 1 000 000.

Имеет ли смысл мой ответ или я полностью упускаю суть?

#include<time.h>
#include<stdio.h>
int main(){
    clock_t begin=clock();

    int i;
    for(i=0;i<1000000;i++){
        printf("%d",i);
    }
    clock_t end=clock();
    printf("Time taken:%lf",(double)(end-begin)/CLOCKS_PER_SEC);
}

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Удивительно, но ответ, который я предоставил выше, был принят как правильный в этом тесте.

Однако, чтобы оптимизировать точность, мы должны исключить метод "printf" и использовать системный вызов с недопустимым параметром какупомянутый Алексом Хоппусом или пустым методом.

В конце результат должен быть разделен на 2, как упомянуто Алексом Хоппусом.

0 голосов
/ 07 февраля 2019

Вы должны попробовать другой подход.

Как уже было сказано, вы пытаетесь измерить

издержки переключения контекста> между ядром и пространством пользователя

Переключение контекста с пользователя на ядро ​​осуществляется через syscall.Наверняка printf внизу использует write системный вызов, но этот системный вызов слишком тяжел, чтобы получить надежную оценку.Чтобы улучшить эту оценку, вы должны ответить на вопрос - какой самый быстрый системный вызов в Linux?И ответ - системный вызов с недопустимым параметром.

PS Не забывайте о точности измерений.Кроме того, вы должны разделить свой результат на 2, потому что системный вызов - в оба конца.

...