blob: 0f194bef36220a7ab2363c67edca334bbd398ed5 [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>
Jeff Thompson18dba8b2013-12-09 12:17:40 -080011#include <stdexcept>
Jeff Thompson687ea652013-12-06 11:28:23 -080012#include <ndn-cpp/data.hpp>
13// Hack: Hook directly into non-API functions.
14#include "../src/c/encoding/binary-xml-decoder.h"
15#include "../src/c/data.h"
16#include "../src/c/encoding/binary-xml-data.h"
17
18using namespace std;
19using namespace ndn;
20using namespace ndn::ptr_lib;
21
22static double
Jeff Thompson18dba8b2013-12-09 12:17:40 -080023getNowSeconds()
Jeff Thompson687ea652013-12-06 11:28:23 -080024{
25 struct timeval t;
26 gettimeofday(&t, 0);
Jeff Thompson18dba8b2013-12-09 12:17:40 -080027 return t.tv_sec + t.tv_usec / 1000000.0;
Jeff Thompson687ea652013-12-06 11:28:23 -080028}
29
30uint8_t Data1[] = {
310x04, 0x82, // NDN Data
32 0x02, 0xaa, // Signature
33 0x03, 0xb2, // SignatureBits
34 0x08, 0x85, 0x20, 0xea, 0xb5, 0xb0, 0x63, 0xda, 0x94, 0xe9, 0x68, 0x7a,
35 0x8e, 0x65, 0x60, 0xe0, 0xc6, 0x43, 0x96, 0xd9, 0x69, 0xb4, 0x40, 0x72, 0x52, 0x00, 0x2c, 0x8e, 0x2a, 0xf5,
36 0x47, 0x12, 0x59, 0x93, 0xda, 0xed, 0x82, 0xd0, 0xf8, 0xe6, 0x65, 0x09, 0x87, 0x84, 0x54, 0xc7, 0xce, 0x9a,
37 0x93, 0x0d, 0x47, 0xf1, 0xf9, 0x3b, 0x98, 0x78, 0x2c, 0x22, 0x21, 0xd9, 0x2b, 0xda, 0x03, 0x30, 0x84, 0xf3,
38 0xc5, 0x52, 0x64, 0x2b, 0x1d, 0xde, 0x50, 0xe0, 0xee, 0xca, 0xa2, 0x73, 0x7a, 0x93, 0x30, 0xa8, 0x47, 0x7f,
39 0x6f, 0x41, 0xb0, 0xc8, 0x6e, 0x89, 0x1c, 0xcc, 0xf9, 0x01, 0x44, 0xc3, 0x08, 0xcf, 0x77, 0x47, 0xfc, 0xed,
40 0x48, 0xf0, 0x4c, 0xe9, 0xc2, 0x3b, 0x7d, 0xef, 0x6e, 0xa4, 0x80, 0x40, 0x9e, 0x43, 0xb6, 0x77, 0x7a, 0x1d,
41 0x51, 0xed, 0x98, 0x33, 0x93, 0xdd, 0x88, 0x01, 0x0e, 0xd3,
42 0x00,
43 0x00,
44 0xf2, 0xfa, 0x9d, 0x6e, 0x64, 0x6e, 0x00, 0xfa, 0x9d, 0x61, 0x62, 0x63, 0x00, 0x00, // Name
45 0x01, 0xa2, // SignedInfo
46 0x03, 0xe2, // PublisherPublicKeyDigest
47 0x02, 0x85, 0xb5, 0x50, 0x6b, 0x1a,
48 0xba, 0x3d, 0xa7, 0x76, 0x1b, 0x0f, 0x8d, 0x61, 0xa4, 0xaa, 0x7e, 0x3b, 0x6d, 0x15, 0xb4, 0x26, 0xfe, 0xb5,
49 0xbd, 0xa8, 0x23, 0x89, 0xac, 0xa7, 0x65, 0xa3, 0xb8, 0x1c,
50 0x00,
51 0x02, 0xba, // Timestamp
52 0xb5, 0x05, 0x1d, 0xde, 0xe9, 0x5b, 0xdb,
53 0x00,
54 0x01, 0xe2, // KeyLocator
55 0x01, 0xda, // Key
56 0x0a, 0x95, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
57 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81,
58 0x81, 0x00, 0xe1, 0x7d, 0x30, 0xa7, 0xd8, 0x28, 0xab, 0x1b, 0x84, 0x0b, 0x17, 0x54, 0x2d, 0xca, 0xf6, 0x20,
59 0x7a, 0xfd, 0x22, 0x1e, 0x08, 0x6b, 0x2a, 0x60, 0xd1, 0x6c, 0xb7, 0xf5, 0x44, 0x48, 0xba, 0x9f, 0x3f, 0x08,
60 0xbc, 0xd0, 0x99, 0xdb, 0x21, 0xdd, 0x16, 0x2a, 0x77, 0x9e, 0x61, 0xaa, 0x89, 0xee, 0xe5, 0x54, 0xd3, 0xa4,
61 0x7d, 0xe2, 0x30, 0xbc, 0x7a, 0xc5, 0x90, 0xd5, 0x24, 0x06, 0x7c, 0x38, 0x98, 0xbb, 0xa6, 0xf5, 0xdc, 0x43,
62 0x60, 0xb8, 0x45, 0xed, 0xa4, 0x8c, 0xbd, 0x9c, 0xf1, 0x26, 0xa7, 0x23, 0x44, 0x5f, 0x0e, 0x19, 0x52, 0xd7,
63 0x32, 0x5a, 0x75, 0xfa, 0xf5, 0x56, 0x14, 0x4f, 0x9a, 0x98, 0xaf, 0x71, 0x86, 0xb0, 0x27, 0x86, 0x85, 0xb8,
64 0xe2, 0xc0, 0x8b, 0xea, 0x87, 0x17, 0x1b, 0x4d, 0xee, 0x58, 0x5c, 0x18, 0x28, 0x29, 0x5b, 0x53, 0x95, 0xeb,
65 0x4a, 0x17, 0x77, 0x9f, 0x02, 0x03, 0x01, 0x00, 0x01,
66 0x00,
67 0x00,
68 0x00,
69 0x01, 0x9a, // Content
70 0xc5, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x21,
71 0x00,
720x00,
731
74};
75
Jeff Thompsonecaf3262013-12-09 17:13:49 -080076#if 0
77static Blob
78testEncodeComplexDataCpp()
Jeff Thompson687ea652013-12-06 11:28:23 -080079{
Jeff Thompson687ea652013-12-06 11:28:23 -080080
Jeff Thompsonecaf3262013-12-09 17:13:49 -080081}
82#endif
83
84static double
85benchmarkDataDecodeSecondsCpp(int nIterations, const Blob& encoding)
86{
Jeff Thompson687ea652013-12-06 11:28:23 -080087 size_t nameSize = 0;
Jeff Thompson18dba8b2013-12-09 12:17:40 -080088 double start = getNowSeconds();
Jeff Thompson687ea652013-12-06 11:28:23 -080089 for (int i = 0; i < nIterations; ++i) {
90 Data data;
Jeff Thompsonecaf3262013-12-09 17:13:49 -080091 data.wireDecode(*encoding);
Jeff Thompson687ea652013-12-06 11:28:23 -080092 nameSize = data.getName().size();
93 }
Jeff Thompson18dba8b2013-12-09 12:17:40 -080094 double finish = getNowSeconds();
95
96 // Sanity check that we are actually decoding.
97 if (nameSize != 2)
98 throw runtime_error("Unexpected data packet name size");
Jeff Thompson687ea652013-12-06 11:28:23 -080099
Jeff Thompsonecaf3262013-12-09 17:13:49 -0800100 return finish - start;
Jeff Thompson687ea652013-12-06 11:28:23 -0800101}
102
Jeff Thompsonecaf3262013-12-09 17:13:49 -0800103static double
104benchmarkDataDecodeSecondsC(double nIterations, uint8_t *encoding, size_t encodingLength)
Jeff Thompson687ea652013-12-06 11:28:23 -0800105{
Jeff Thompson687ea652013-12-06 11:28:23 -0800106 size_t nameSize = 0;
Jeff Thompson18dba8b2013-12-09 12:17:40 -0800107 double start = getNowSeconds();
Jeff Thompson687ea652013-12-06 11:28:23 -0800108 for (int i = 0; i < nIterations; ++i) {
109 struct ndn_NameComponent nameComponents[100];
110 struct ndn_NameComponent keyNameComponents[100];
111 struct ndn_Data dataStruct;
112 ndn_Data_initialize
113 (&dataStruct, nameComponents, sizeof(nameComponents) / sizeof(nameComponents[0]),
114 keyNameComponents, sizeof(keyNameComponents) / sizeof(keyNameComponents[0]));
115
116 ndn_BinaryXmlDecoder decoder;
Jeff Thompsonecaf3262013-12-09 17:13:49 -0800117 ndn_BinaryXmlDecoder_initialize(&decoder, encoding, encodingLength);
Jeff Thompson687ea652013-12-06 11:28:23 -0800118 size_t signedPortionBeginOffset, signedPortionEndOffset;
119 ndn_Error error;
120 if ((error = ndn_decodeBinaryXmlData(&dataStruct, &signedPortionBeginOffset, &signedPortionEndOffset, &decoder)))
121 {
122 cout << "Error in ndn_decodeBinaryXmlData: " << ndn_getErrorString(error) << endl;
Jeff Thompsonecaf3262013-12-09 17:13:49 -0800123 return 0;
Jeff Thompson687ea652013-12-06 11:28:23 -0800124 }
125
126 nameSize = dataStruct.name.nComponents;
127 }
Jeff Thompson18dba8b2013-12-09 12:17:40 -0800128 double finish = getNowSeconds();
129
130 // Sanity check that we are actually decoding.
131 if (nameSize != 2)
132 throw runtime_error("Unexpected data packet name size");
Jeff Thompson687ea652013-12-06 11:28:23 -0800133
Jeff Thompsonecaf3262013-12-09 17:13:49 -0800134 return finish - start;
Jeff Thompson687ea652013-12-06 11:28:23 -0800135}
136
137int
138main(int argc, char** argv)
139{
Jeff Thompson18dba8b2013-12-09 12:17:40 -0800140 try {
Jeff Thompsonecaf3262013-12-09 17:13:49 -0800141 {
142 Blob encoding(Data1, sizeof(Data1));
143
144 int nIterations = 1000000;
145 double duration = benchmarkDataDecodeSecondsCpp(nIterations, encoding);
146 cout << "Data decode C++: Duration sec: " << duration << ", Hz: " << (nIterations / duration) << endl;
147 }
148 {
149 int nIterations = 20000000;
150 double duration = benchmarkDataDecodeSecondsC(nIterations, Data1, sizeof(Data1));
151 cout << "Data decode C: Duration sec: " << duration << ", Hz: " << (nIterations / duration) << endl;
152 }
Jeff Thompson18dba8b2013-12-09 12:17:40 -0800153 } catch (std::exception& e) {
154 cout << "exception: " << e.what() << endl;
155 }
Jeff Thompson687ea652013-12-06 11:28:23 -0800156 return 0;
157}