代码之家  ›  专栏  ›  技术社区  ›  oliver

以特定速度输出标准输出

  •  6
  • oliver  · 技术社区  · 16 年前

    对于我的应用程序的负载测试(在Linux下),我正在寻找一个工具,它以特定的速率(如100字节/秒)在stdout上输出数据,这样我就可以将输出传输到netcat,netcat将其发送到我的应用程序。对于DD来说有些选择是理想的,但到目前为止我还没有发现任何东西。打印哪种数据并不重要(nul字节可以)。有什么暗示吗?

    4 回复  |  直到 12 年前
        1
  •  3
  •   eborisch    12 年前

    我认为这是你真正想要的: Pipe Viewer

    使用 <fast input> | pv -qL <rate>[k|m|g|t] | <rate-limited output> 将管道限制在要求的速率。

        2
  •  5
  •   C. K. Young    16 年前

    我写了一个快速的程序,只需要一个参数,多少个 A 每秒打印到标准输出的字符数(负参数表示没有速率限制)。希望这有帮助!:-)(在GNU libc上,您需要将程序与 -lrt )

    编辑:默认情况下修改为打印点,除非指定了第二个参数,在这种情况下,将使用该参数的第一个字符。(这意味着,如果要打印nul字符,只需指定一个空字符串作为第二个参数。-)

    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <unistd.h>
    
    int
    sleeptill(const struct timespec *when)
    {
        struct timespec now, diff;
    
        clock_gettime(CLOCK_REALTIME, &now);
        diff.tv_sec = when->tv_sec - now.tv_sec;
        diff.tv_nsec = when->tv_nsec - now.tv_nsec;
        while (diff.tv_nsec < 0) {
            diff.tv_nsec += 1000000000;
            --diff.tv_sec;
        }
        if (diff.tv_sec < 0)
            return 0;
        return nanosleep(&diff, 0);
    }
    
    int
    main(int argc, char **argv)
    {
        double rate = 0.0;
        char *endp;
        struct timespec start;
        double offset;
    
        if (argc >= 2) {
            rate = strtod(argv[1], &endp);
            if (endp == argv[1] || *endp)
                rate = 0.0;
            else
                rate = 1 / rate;
    
            if (!argv[2])
                argv[2] = ".";
        }
    
        if (!rate) {
            fprintf(stderr, "usage: %s rate [char]\n", argv[0]);
            return 1;
        }
    
        clock_gettime(CLOCK_REALTIME, &start);
        offset = start.tv_nsec / 1000000000.0;
    
        while (1) {
            struct timespec till = start;
            double frac;
            double whole;
    
            frac = modf(offset += rate, &whole);
            till.tv_sec += whole;
            till.tv_nsec = frac * 1000000000.0;
            sleeptill(&till);
            write(STDOUT_FILENO, argv[2], 1);
        }
    }
    
        3
  •  2
  •   unwind    16 年前

    如果一次可以获得全部100个字节,那么可以使用 sleep 老实 echo 至少作为第一次尝试。

        4
  •  0
  •   oliver    16 年前

    我现在用nuttcp来做“真实”的负载测试。它似乎有相当低的开销,所以测试系统没有太多的干扰。