性能測定/ソース一覧

性能測定ソース一覧

メモリ負荷(C言語)

メモリに対して負荷をかけるツール。
指定した分のメモリ領域をN個確保する。
その後繰り返しメモリ領域にアクセスして負荷をかけ続ける。

mem.cソース

mem.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/time.h>

int main(int argc, char* argv[])
{
char *outputdir;
 int size_mb = 1, size_total = 0, mem_num = 0, interval = 0, memset_mb;
 int acsMem;
 struct timeval s, t;
 double start=0, end=0;
 size_t size_byte, memset_size;
 FILE *output;

if (argc != 7) {
   fprintf(stderr, "Usage: %s <Size(MB)> <MemNum> <AccessMem> <memsetMemSize> <Interval(sec)> <OutputFile>\n", argv[0]);
   exit(1);
 }
 size_mb = atoi(argv[1]);
 size_byte = size_mb * 1048576UL;
 mem_num = atoi(argv[2]);
 acsMem = atoi(argv[3]);
 memset_mb = atoi(argv[4]);
 memset_size = memset_mb * 1048576UL;
 interval = atoi(argv[5]);
 outputdir = argv[6]; 
 
 printf("-----Info----------\n");
 printf("MemSize[MB] * MemNum = %d * %d\n", size_mb, mem_num);
 printf("Access Memory = %d\n", acsMem);
 printf("memset MemSize[MB] = %d\n", memset_mb);
 printf("interval = %d\n", interval);
 printf("Output Directory = %s\n", outputdir);
 printf("PID = %d\n", getpid());
 printf("-------------------\n");

output = fopen(outputdir, "a");
 fprintf(output, "-----Info----------\n");
 fprintf(output, "MemSize[MB] * MemNum = %d * %d\n", size_mb, mem_num);
 fprintf(output, "Access Memory = %d\n", acsMem);
 fprintf(output, "memset MemSize[MB] = %d\n", memset_mb);
 fprintf(output, "interval = %d\n", interval);
 fprintf(output, "Output Directory = %s\n", outputdir);
 fprintf(output, "PID = %d\n", getpid());
 fprintf(output, "-------------------\n");
 fclose(output);
 
 char *bufary[mem_num];

printf("Memory initialize...\n");
 for(int cnt = 0; cnt < mem_num; cnt++){
   bufary[cnt] = (char*)malloc(size_byte);
   if(!bufary[cnt]){
     printf("bad aloc\n");
     return 1;
   }
   memset(bufary[cnt], 0xff, size_byte); 
   size_total += size_mb;
   printf("allocated : cnt=%d, total=%d(MB))\n", cnt+1, size_total);
 }

if(interval == 0){
   int count = 0;
   while(1){
     count++;
     sleep(1);
   }
 }else{
   while(1){
     gettimeofday(&s, NULL);
     memset(bufary[acsMem-1], 0xff, memset_size); 
     gettimeofday(&t, NULL);
     start = s.tv_sec + (double)(s.tv_usec * 1e-6); 
     end = t.tv_sec + (double)(t.tv_usec * 1e-6); 
     output = fopen(outputdir, "a");
     fprintf(output, "acsMem=%d, memset_size=%d\nmemset_time=%f[ms]\n", acsMem, memset_mb, (end - start) * 1000);
     fclose(output);
     sleep(interval);
   }
 }
 return 0;
}

実行手順

コンパイル手順
# gcc -std=c99 -o mem mem.c

実行例:
メモリ100MB領域を5個分確保する。1秒おきに1番目のメモリの50MB分を操作するのを繰り返す。
# mem 100 5 1 50 1

  • 最終更新:2014-06-07 18:55:45

このWIKIを編集するにはパスワード入力が必要です

認証パスワード