⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 profile.c

📁 CMU大名鼎鼎的SPHINX-3大词汇量连续语音识别系统
💻 C
字号:
/* ==================================================================== * Copyright (c) 1999-2001 Carnegie Mellon University.  All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer.  * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * This work was supported in part by funding from the Defense Advanced  * Research Projects Agency and the National Science Foundation of the  * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * *//* * profile.c -- For timing and event counting. * * ********************************************** * CMU ARPA Speech Project * * Copyright (c) 1999 Carnegie Mellon University. * ALL RIGHTS RESERVED. * ********************************************** *  * HISTORY *  * 11-Mar-1999	M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University * 		Added ptmr_init(). *  * 19-Jun-97	M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University * 		Created. */#include <stdio.h>#include <stdlib.h>#include <string.h>#if (! WIN32)#include <unistd.h>#include <sys/time.h>#include <sys/resource.h>#else#include <windows.h>#include <time.h>#endif#include "profile.h"#include "err.h"#include "ckd_alloc.h"#if (__ALPHA_OSF1__)extern uint32 rpcc( void );	/* On an alpha, use the RPCC instruction */#endifint32 pctr_new (pctr_t ctr, char *nm){  ctr.name = ckd_salloc (nm);   ctr.count = 0;  return 1;}void pctr_reset (pctr_t ctr){    ctr.count = 0;}void pctr_increment (pctr_t ctr, int32 inc){    ctr.count += inc;}void pctr_print(FILE *fp, pctr_t ctr){/*  if(!ctr.name)    return 0;*/  fprintf (fp, "CTR:");  fprintf (fp, "  %d %s", ctr.count, ctr.name);}int32 host_pclk (int32 dummy){    int32 mhz = 0;#if (__ALPHA_OSF1__)    int32 i, j, k, besti, bestj, diff;    uint32 rpcc_start, rpcc_end;    struct rusage start, stop;    float64 t;        memset (&start, 0, sizeof(struct rusage));    memset (&stop, 0, sizeof(struct rusage));        getrusage (RUSAGE_SELF, &start);    rpcc_start = rpcc();    /* Consume some cpu cycles; dummy to forced compiler not to optimize loop away */    dummy &= 0x7fffffff;    dummy |= 0x70000000;    for (i = 1; i < 100000000; i++)	if (i > dummy)	    return (i);    rpcc_end = rpcc();    getrusage (RUSAGE_SELF, &stop);        t = (stop.ru_utime.tv_sec - start.ru_utime.tv_sec) + 	((stop.ru_utime.tv_usec - start.ru_utime.tv_usec) * 0.000001);    mhz = ((rpcc_end - rpcc_start) / t) * 0.000001 + 0.5;    diff = (int32)0x7fffffff;    for (i = 100; i <= 1000; i += 100) {	for (j = 1; j <= 10; j++) {	    k = i/j - mhz;	    if (k < 0)		k = -k;	    if (k < diff) {		diff = k;		besti = i;		bestj = j;	    }	}    }    mhz = besti/bestj;    E_INFO("%d ticks in %.3f sec; machine clock rate = %d MHz\n",	   rpcc_end - rpcc_start, t, mhz);#endif        return mhz;}#if (WIN32)#define TM_LOWSCALE	1e-7#define TM_HIGHSCALE	(4294967296.0 * TM_LOWSCALE);static float64 make_sec (FILETIME *tm){    float64 dt;        dt = tm->dwLowDateTime * TM_LOWSCALE;    dt += tm->dwHighDateTime * TM_HIGHSCALE;        return (dt);}#elsestatic float64 make_sec (struct timeval *s){    return (s->tv_sec + s->tv_usec * 0.000001);}#endifvoid ptmr_start (ptmr_t *tm){#if (! WIN32)    struct timeval e_start;	/* Elapsed time */    #if (! _HPUX_SOURCE)    struct rusage start;	/* CPU time */        /* Unix but not HPUX */    getrusage (RUSAGE_SELF, &start);    tm->start_cpu = make_sec (&start.ru_utime) + make_sec (&start.ru_stime);#endif    /* Unix + HP */    gettimeofday (&e_start, 0);    tm->start_elapsed = make_sec (&e_start);#else    HANDLE pid;    FILETIME t_create, t_exit, kst, ust;        /* PC */    pid = GetCurrentProcess();    GetProcessTimes (pid, &t_create, &t_exit, &kst, &ust);    tm->start_cpu = make_sec (&ust) + make_sec (&kst);    tm->start_elapsed = (float64)clock() / CLOCKS_PER_SEC;#endif}void ptmr_stop (ptmr_t *tm){    float64 dt_cpu, dt_elapsed;    #if (! WIN32)    struct timeval e_stop;	/* Elapsed time */    #if (! _HPUX_SOURCE)    struct rusage stop;		/* CPU time */        /* Unix but not HPUX */    getrusage (RUSAGE_SELF, &stop);    dt_cpu = make_sec (&stop.ru_utime) + make_sec (&stop.ru_stime) - tm->start_cpu;#else    dt_cpu = 0.0;#endif    /* Unix + HP */    gettimeofday (&e_stop, 0);    dt_elapsed = (make_sec (&e_stop) - tm->start_elapsed);#else    HANDLE pid;    FILETIME t_create, t_exit, kst, ust;        /* PC */    pid = GetCurrentProcess();    GetProcessTimes (pid, &t_create, &t_exit, &kst, &ust);    dt_cpu = make_sec (&ust) + make_sec (&kst) - tm->start_cpu;    dt_elapsed = ((float64)clock() / CLOCKS_PER_SEC) - tm->start_elapsed;#endif    tm->t_cpu += dt_cpu;    tm->t_elapsed += dt_elapsed;    tm->t_tot_cpu += dt_cpu;    tm->t_tot_elapsed += dt_elapsed;}void ptmr_reset (ptmr_t *tm){    tm->t_cpu = 0.0;    tm->t_elapsed = 0.0;}void ptmr_init (ptmr_t *tm){    tm->t_cpu = 0.0;    tm->t_elapsed = 0.0;    tm->t_tot_cpu = 0.0;    tm->t_tot_elapsed = 0.0;}void ptmr_reset_all (ptmr_t *tm){    for (; tm->name; tm++)	ptmr_reset (tm);}void ptmr_print_all (FILE *fp, ptmr_t *tm, float64 norm){    if (norm != 0.0) {	norm = 1.0/norm;	for (; tm->name; tm++)	    fprintf (fp, "  %6.2fx %s", tm->t_cpu * norm, tm->name);    }}int32 host_endian ( void ){    FILE *fp;    int32 BYTE_ORDER_MAGIC;    char *file;    char buf[8];    int32 k, endian;        file = "/tmp/__EnDiAn_TeSt__";        if ((fp = fopen(file, "wb")) == NULL) {	E_ERROR("fopen(%s,wb) failed\n", file);	return -1;    }        BYTE_ORDER_MAGIC = (int32)0x11223344;        k = (int32) BYTE_ORDER_MAGIC;    if (fwrite (&k, sizeof(int32), 1, fp) != 1) {	E_ERROR("fwrite(%s) failed\n", file);	fclose (fp);	unlink(file);	return -1;    }        fclose (fp);    if ((fp = fopen (file, "rb")) == NULL) {	E_ERROR ("fopen(%s,rb) failed\n", file);	unlink(file);	return -1;    }    if (fread (buf, 1, sizeof(int32), fp) != sizeof(int32)) {	E_ERROR ("fread(%s) failed\n", file);	fclose (fp);	unlink(file);	return -1;    }    fclose (fp);    unlink(file);        /* If buf[0] == lsB of BYTE_ORDER_MAGIC, we are little-endian */    endian = (buf[0] == (BYTE_ORDER_MAGIC & 0x000000ff)) ? 1 : 0;        return (endian);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -