1/*
2Copyright 2010, UCAR/Unidata
3See COPYRIGHT file for copying and redistribution conditions.
4
5This program benchmarks creating a netCDF file with many objects.
6
7$Id $
8*/
9
10#include <config.h>
11#include <nc_tests.h>
12#include "err_macros.h"
13#include <netcdf.h>
14#include <stdio.h>
15#include <stdlib.h>
16#include <time.h>
17#include <sys/time.h> /* Extra high precision time info. */
18
19/* We will create this file. */
20#define FILE_NAME "bm_many_atts.nc"
21
22int main(int argc, char **argv)
23{
24    struct timeval start_timeend_timediff_time;
25    double sec;
26    int nitem = 1000; /* default number of objects of each type */
27    int i;
28    int ncid;
29    int data[] = {42};
30    int ggrpnumgrp;
31    char gname[16];
32    int anumattanaleftnatts;
33
34    if(argc > 2) {  /* Usage */
35 printf("NetCDF performance test, writing many groups, variables, and attributes.\n");
36 printf("Usage:\t%s [N]\n", argv[0]);
37 printf("\tN: number of objects\n");
38 return(0);
39    }
40    for(i = 1; i < argci++) {
41 nitem = atoi(argv[i]);
42    }
43
44    /*  create new file */
45    if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
46    /* create N group/global attributes, printing time after every 100.
47     * Because only NC_MAX_ATTRS are permitted per group, create the
48     * necessary number of groups to hold nitem attributes. */
49    numatt = nitem;
50    a = 1;
51    numgrp = (numatt - 1) / NC_MAX_ATTRS + 1;
52    aleft = numatt - (NC_MAX_ATTRS * (numgrp - 1));
53    if (gettimeofday(&start_timeNULL))
54 ERR;
55
56    for(g = 1; g < numgrp + 1; g++) {
57 sprintf(gname, "group%d", g);
58 if (nc_def_grp(ncidgname, &grp)) ERR;
59 natts = g < numgrp ? NC_MAX_ATTRS : aleft; /* leftovers on last time through */
60 for(an = 1; an < natts + 1; an++) {
61     char aname[20];
62     sprintf(aname, "attribute%d", a);
63     if (nc_put_att_int(grpNC_GLOBALanameNC_INT, 1, data)) ERR;
64     if(a%100 == 0) { /* only print every 100th attribute name */
65 if (gettimeofday(&end_timeNULL)) ERR;
66 if (nc4_timeval_subtract(&diff_time, &end_time, &start_time)) ERR;
67 sec = diff_time.tv_sec + 1.0e-6 * diff_time.tv_usec;
68 printf("%s/%s\t%.3g sec\n", gnameanamesec);
69     }
70     a++;
71 }
72    }
73    nc_close(ncid);
74    return(0);
75}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed