blob: 7864f89a19f549a3ab9e7a8ecc132dc3a28b2eb0 [file] [log] [blame]
Jeff Thompson687ea652013-12-06 11:28:23 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
2/**
3 * Copyright (C) 2013 Regents of the University of California.
4 * @author: Jeff Thompson <jefft0@remap.ucla.edu>
5 * See COPYING for copyright and distribution information.
6 */
7
8#include <iostream>
9#include <time.h>
10#include <sys/time.h>
11#include <ndn-cpp/data.hpp>
12// Hack: Hook directly into non-API functions.
13#include "../src/c/encoding/binary-xml-decoder.h"
14#include "../src/c/data.h"
15#include "../src/c/encoding/binary-xml-data.h"
16
17using namespace std;
18using namespace ndn;
19using namespace ndn::ptr_lib;
20
21static double
22getNowMicroseconds()
23{
24 struct timeval t;
25 gettimeofday(&t, 0);
26 return t.tv_sec * 1000000.0 + t.tv_usec;
27}
28
29uint8_t Data1[] = {
300x04, 0x82, // NDN Data
31 0x02, 0xaa, // Signature
32 0x03, 0xb2, // SignatureBits
33 0x08, 0x85, 0x20, 0xea, 0xb5, 0xb0, 0x63, 0xda, 0x94, 0xe9, 0x68, 0x7a,
34 0x8e, 0x65, 0x60, 0xe0, 0xc6, 0x43, 0x96, 0xd9, 0x69, 0xb4, 0x40, 0x72, 0x52, 0x00, 0x2c, 0x8e, 0x2a, 0xf5,
35 0x47, 0x12, 0x59, 0x93, 0xda, 0xed, 0x82, 0xd0, 0xf8, 0xe6, 0x65, 0x09, 0x87, 0x84, 0x54, 0xc7, 0xce, 0x9a,
36 0x93, 0x0d, 0x47, 0xf1, 0xf9, 0x3b, 0x98, 0x78, 0x2c, 0x22, 0x21, 0xd9, 0x2b, 0xda, 0x03, 0x30, 0x84, 0xf3,
37 0xc5, 0x52, 0x64, 0x2b, 0x1d, 0xde, 0x50, 0xe0, 0xee, 0xca, 0xa2, 0x73, 0x7a, 0x93, 0x30, 0xa8, 0x47, 0x7f,
38 0x6f, 0x41, 0xb0, 0xc8, 0x6e, 0x89, 0x1c, 0xcc, 0xf9, 0x01, 0x44, 0xc3, 0x08, 0xcf, 0x77, 0x47, 0xfc, 0xed,
39 0x48, 0xf0, 0x4c, 0xe9, 0xc2, 0x3b, 0x7d, 0xef, 0x6e, 0xa4, 0x80, 0x40, 0x9e, 0x43, 0xb6, 0x77, 0x7a, 0x1d,
40 0x51, 0xed, 0x98, 0x33, 0x93, 0xdd, 0x88, 0x01, 0x0e, 0xd3,
41 0x00,
42 0x00,
43 0xf2, 0xfa, 0x9d, 0x6e, 0x64, 0x6e, 0x00, 0xfa, 0x9d, 0x61, 0x62, 0x63, 0x00, 0x00, // Name
44 0x01, 0xa2, // SignedInfo
45 0x03, 0xe2, // PublisherPublicKeyDigest
46 0x02, 0x85, 0xb5, 0x50, 0x6b, 0x1a,
47 0xba, 0x3d, 0xa7, 0x76, 0x1b, 0x0f, 0x8d, 0x61, 0xa4, 0xaa, 0x7e, 0x3b, 0x6d, 0x15, 0xb4, 0x26, 0xfe, 0xb5,
48 0xbd, 0xa8, 0x23, 0x89, 0xac, 0xa7, 0x65, 0xa3, 0xb8, 0x1c,
49 0x00,
50 0x02, 0xba, // Timestamp
51 0xb5, 0x05, 0x1d, 0xde, 0xe9, 0x5b, 0xdb,
52 0x00,
53 0x01, 0xe2, // KeyLocator
54 0x01, 0xda, // Key
55 0x0a, 0x95, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
56 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81,
57 0x81, 0x00, 0xe1, 0x7d, 0x30, 0xa7, 0xd8, 0x28, 0xab, 0x1b, 0x84, 0x0b, 0x17, 0x54, 0x2d, 0xca, 0xf6, 0x20,
58 0x7a, 0xfd, 0x22, 0x1e, 0x08, 0x6b, 0x2a, 0x60, 0xd1, 0x6c, 0xb7, 0xf5, 0x44, 0x48, 0xba, 0x9f, 0x3f, 0x08,
59 0xbc, 0xd0, 0x99, 0xdb, 0x21, 0xdd, 0x16, 0x2a, 0x77, 0x9e, 0x61, 0xaa, 0x89, 0xee, 0xe5, 0x54, 0xd3, 0xa4,
60 0x7d, 0xe2, 0x30, 0xbc, 0x7a, 0xc5, 0x90, 0xd5, 0x24, 0x06, 0x7c, 0x38, 0x98, 0xbb, 0xa6, 0xf5, 0xdc, 0x43,
61 0x60, 0xb8, 0x45, 0xed, 0xa4, 0x8c, 0xbd, 0x9c, 0xf1, 0x26, 0xa7, 0x23, 0x44, 0x5f, 0x0e, 0x19, 0x52, 0xd7,
62 0x32, 0x5a, 0x75, 0xfa, 0xf5, 0x56, 0x14, 0x4f, 0x9a, 0x98, 0xaf, 0x71, 0x86, 0xb0, 0x27, 0x86, 0x85, 0xb8,
63 0xe2, 0xc0, 0x8b, 0xea, 0x87, 0x17, 0x1b, 0x4d, 0xee, 0x58, 0x5c, 0x18, 0x28, 0x29, 0x5b, 0x53, 0x95, 0xeb,
64 0x4a, 0x17, 0x77, 0x9f, 0x02, 0x03, 0x01, 0x00, 0x01,
65 0x00,
66 0x00,
67 0x00,
68 0x01, 0x9a, // Content
69 0xc5, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
70 0x00,
710x00,
721
73};
74
75static void
76testDataDecodeCpp()
77{
78 double nIterations = 1000000;
79
80 size_t nameSize = 0;
81 double start = getNowMicroseconds();
82 for (int i = 0; i < nIterations; ++i) {
83 Data data;
84 data.wireDecode(Data1, sizeof(Data1));
85 nameSize = data.getName().size();
86 }
87 double finish = getNowMicroseconds();
88
89 cout << "Data decode C++: name size: " << nameSize << ", usec: " << ((finish - start) / nIterations) << endl;
90}
91
92static void
93testDataDecodeC()
94{
95 double nIterations = 20000000;
96
97 size_t nameSize = 0;
98 double start = getNowMicroseconds();
99 for (int i = 0; i < nIterations; ++i) {
100 struct ndn_NameComponent nameComponents[100];
101 struct ndn_NameComponent keyNameComponents[100];
102 struct ndn_Data dataStruct;
103 ndn_Data_initialize
104 (&dataStruct, nameComponents, sizeof(nameComponents) / sizeof(nameComponents[0]),
105 keyNameComponents, sizeof(keyNameComponents) / sizeof(keyNameComponents[0]));
106
107 ndn_BinaryXmlDecoder decoder;
108 ndn_BinaryXmlDecoder_initialize(&decoder, Data1, sizeof(Data1));
109 size_t signedPortionBeginOffset, signedPortionEndOffset;
110 ndn_Error error;
111 if ((error = ndn_decodeBinaryXmlData(&dataStruct, &signedPortionBeginOffset, &signedPortionEndOffset, &decoder)))
112 {
113 cout << "Error in ndn_decodeBinaryXmlData: " << ndn_getErrorString(error) << endl;
114 return;
115 }
116
117 nameSize = dataStruct.name.nComponents;
118 }
119 double finish = getNowMicroseconds();
120
121 cout << "Data decode C: name size: " << nameSize << ", usec: " << ((finish - start) / nIterations) << endl;
122}
123
124int
125main(int argc, char** argv)
126{
127 testDataDecodeCpp();
128 testDataDecodeC();
129
130 return 0;
131}