Snapman系统中TCC执行效率和C#执行效率对比
Snapman集合了TCC编译器可以直接编译执行C语言脚本,其脚本执行效率和C#编译程序进行效率对比,包括下面4方面:
1、函数执行效率
2、数字转换成字符串
3、字符串的叠加
4、MD5算法
这是C#代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections; namespace TestEfficiency
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} int fibonacci(int n)
{
if (n == || n == )
return ;
return fibonacci(n - ) + fibonacci(n - );
}
string numberConvert()
{
string result = "";
for (int i = ; i < ; i++ )
{
result = i.ToString();
}
return result;
}
string stringAppend()
{
string conc = "StringBuilder sb = new StringBuilder(1024);";
StringBuilder sb = new StringBuilder();
for (int i = ; i < ; i++)
{
sb = new StringBuilder();
for (int j = ; j < ; j++ )
{
sb.Append(conc);
}
}
return sb.ToString();
}
public class MD5
{
//static state variables
private static UInt32 A;
private static UInt32 B;
private static UInt32 C;
private static UInt32 D; //number of bits to rotate in tranforming
private const int S11 = ;
private const int S12 = ;
private const int S13 = ;
private const int S14 = ;
private const int S21 = ;
private const int S22 = ;
private const int S23 = ;
private const int S24 = ;
private const int S31 = ;
private const int S32 = ;
private const int S33 = ;
private const int S34 = ;
private const int S41 = ;
private const int S42 = ;
private const int S43 = ;
private const int S44 = ; /* F, G, H and I are basic MD5 functions.
* 四个非线性函数:
*
* F(X,Y,Z) =(X&Y)|((~X)&Z)
* G(X,Y,Z) =(X&Z)|(Y&(~Z))
* H(X,Y,Z) =X^Y^Z
* I(X,Y,Z)=Y^(X|(~Z))
*
* (&与,|或,~非,^异或)
*/
private static UInt32 F(UInt32 x, UInt32 y, UInt32 z)
{
return (x & y) | ((~x) & z);
}
private static UInt32 G(UInt32 x, UInt32 y, UInt32 z)
{
return (x & z) | (y & (~z));
}
private static UInt32 H(UInt32 x, UInt32 y, UInt32 z)
{
return x ^ y ^ z;
}
private static UInt32 I(UInt32 x, UInt32 y, UInt32 z)
{
return y ^ (x | (~z));
} /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
* Rotation is separate from addition to prevent recomputation.
*/
private static void FF(ref UInt32 a, UInt32 b, UInt32 c, UInt32 d, UInt32 mj, int s, UInt32 ti)
{
a = a + F(b, c, d) + mj + ti;
a = a << s | a >> ( - s);
a += b;
}
private static void GG(ref UInt32 a, UInt32 b, UInt32 c, UInt32 d, UInt32 mj, int s, UInt32 ti)
{
a = a + G(b, c, d) + mj + ti;
a = a << s | a >> ( - s);
a += b;
}
private static void HH(ref UInt32 a, UInt32 b, UInt32 c, UInt32 d, UInt32 mj, int s, UInt32 ti)
{
a = a + H(b, c, d) + mj + ti;
a = a << s | a >> ( - s);
a += b;
}
private static void II(ref UInt32 a, UInt32 b, UInt32 c, UInt32 d, UInt32 mj, int s, UInt32 ti)
{
a = a + I(b, c, d) + mj + ti;
a = a << s | a >> ( - s);
a += b;
} private static void MD5_Init()
{
A = 0x67452301; //in memory, this is 0x01234567
B = 0xefcdab89; //in memory, this is 0x89abcdef
C = 0x98badcfe; //in memory, this is 0xfedcba98
D = 0x10325476; //in memory, this is 0x76543210
} private static UInt32[] MD5_Append(byte[] input)
{
int zeros = ;
int ones = ;
int size = ;
int n = input.Length;
int m = n % ;
if (m < )
{
zeros = - m;
size = n - m + ;
}
else if (m == )
{
zeros = ;
ones = ;
size = n + ;
}
else
{
zeros = - m + ;
size = n + - m + ;
} ArrayList bs = new ArrayList(input);
if (ones == )
{
bs.Add((byte)0x80); // 0x80 = $10000000
}
for (int i = ; i < zeros; i++)
{
bs.Add((byte));
} UInt64 N = (UInt64)n * ;
byte h1 = (byte)(N & 0xFF);
byte h2 = (byte)((N >> ) & 0xFF);
byte h3 = (byte)((N >> ) & 0xFF);
byte h4 = (byte)((N >> ) & 0xFF);
byte h5 = (byte)((N >> ) & 0xFF);
byte h6 = (byte)((N >> ) & 0xFF);
byte h7 = (byte)((N >> ) & 0xFF);
byte h8 = (byte)(N >> );
bs.Add(h1);
bs.Add(h2);
bs.Add(h3);
bs.Add(h4);
bs.Add(h5);
bs.Add(h6);
bs.Add(h7);
bs.Add(h8);
byte[] ts = (byte[])bs.ToArray(typeof(byte)); /* Decodes input (byte[]) into output (UInt32[]). Assumes len is
* a multiple of 4.
*/
UInt32[] output = new UInt32[size / ];
for (Int64 i = , j = ; i < size; j++, i += )
{
output[j] = (UInt32)(ts[i] | ts[i + ] << | ts[i + ] << | ts[i + ] << );
}
return output;
}
private static UInt32[] MD5_Trasform(UInt32[] x)
{ UInt32 a, b, c, d; for (int k = ; k < x.Length; k += )
{
a = A;
b = B;
c = C;
d = D; /* Round 1 */
FF(ref a, b, c, d, x[k + ], S11, 0xd76aa478); /* 1 */
FF(ref d, a, b, c, x[k + ], S12, 0xe8c7b756); /* 2 */
FF(ref c, d, a, b, x[k + ], S13, 0x242070db); /* 3 */
FF(ref b, c, d, a, x[k + ], S14, 0xc1bdceee); /* 4 */
FF(ref a, b, c, d, x[k + ], S11, 0xf57c0faf); /* 5 */
FF(ref d, a, b, c, x[k + ], S12, 0x4787c62a); /* 6 */
FF(ref c, d, a, b, x[k + ], S13, 0xa8304613); /* 7 */
FF(ref b, c, d, a, x[k + ], S14, 0xfd469501); /* 8 */
FF(ref a, b, c, d, x[k + ], S11, 0x698098d8); /* 9 */
FF(ref d, a, b, c, x[k + ], S12, 0x8b44f7af); /* 10 */
FF(ref c, d, a, b, x[k + ], S13, 0xffff5bb1); /* 11 */
FF(ref b, c, d, a, x[k + ], S14, 0x895cd7be); /* 12 */
FF(ref a, b, c, d, x[k + ], S11, 0x6b901122); /* 13 */
FF(ref d, a, b, c, x[k + ], S12, 0xfd987193); /* 14 */
FF(ref c, d, a, b, x[k + ], S13, 0xa679438e); /* 15 */
FF(ref b, c, d, a, x[k + ], S14, 0x49b40821); /* 16 */ /* Round 2 */
GG(ref a, b, c, d, x[k + ], S21, 0xf61e2562); /* 17 */
GG(ref d, a, b, c, x[k + ], S22, 0xc040b340); /* 18 */
GG(ref c, d, a, b, x[k + ], S23, 0x265e5a51); /* 19 */
GG(ref b, c, d, a, x[k + ], S24, 0xe9b6c7aa); /* 20 */
GG(ref a, b, c, d, x[k + ], S21, 0xd62f105d); /* 21 */
GG(ref d, a, b, c, x[k + ], S22, 0x2441453); /* 22 */
GG(ref c, d, a, b, x[k + ], S23, 0xd8a1e681); /* 23 */
GG(ref b, c, d, a, x[k + ], S24, 0xe7d3fbc8); /* 24 */
GG(ref a, b, c, d, x[k + ], S21, 0x21e1cde6); /* 25 */
GG(ref d, a, b, c, x[k + ], S22, 0xc33707d6); /* 26 */
GG(ref c, d, a, b, x[k + ], S23, 0xf4d50d87); /* 27 */
GG(ref b, c, d, a, x[k + ], S24, 0x455a14ed); /* 28 */
GG(ref a, b, c, d, x[k + ], S21, 0xa9e3e905); /* 29 */
GG(ref d, a, b, c, x[k + ], S22, 0xfcefa3f8); /* 30 */
GG(ref c, d, a, b, x[k + ], S23, 0x676f02d9); /* 31 */
GG(ref b, c, d, a, x[k + ], S24, 0x8d2a4c8a); /* 32 */ /* Round 3 */
HH(ref a, b, c, d, x[k + ], S31, 0xfffa3942); /* 33 */
HH(ref d, a, b, c, x[k + ], S32, 0x8771f681); /* 34 */
HH(ref c, d, a, b, x[k + ], S33, 0x6d9d6122); /* 35 */
HH(ref b, c, d, a, x[k + ], S34, 0xfde5380c); /* 36 */
HH(ref a, b, c, d, x[k + ], S31, 0xa4beea44); /* 37 */
HH(ref d, a, b, c, x[k + ], S32, 0x4bdecfa9); /* 38 */
HH(ref c, d, a, b, x[k + ], S33, 0xf6bb4b60); /* 39 */
HH(ref b, c, d, a, x[k + ], S34, 0xbebfbc70); /* 40 */
HH(ref a, b, c, d, x[k + ], S31, 0x289b7ec6); /* 41 */
HH(ref d, a, b, c, x[k + ], S32, 0xeaa127fa); /* 42 */
HH(ref c, d, a, b, x[k + ], S33, 0xd4ef3085); /* 43 */
HH(ref b, c, d, a, x[k + ], S34, 0x4881d05); /* 44 */
HH(ref a, b, c, d, x[k + ], S31, 0xd9d4d039); /* 45 */
HH(ref d, a, b, c, x[k + ], S32, 0xe6db99e5); /* 46 */
HH(ref c, d, a, b, x[k + ], S33, 0x1fa27cf8); /* 47 */
HH(ref b, c, d, a, x[k + ], S34, 0xc4ac5665); /* 48 */ /* Round 4 */
II(ref a, b, c, d, x[k + ], S41, 0xf4292244); /* 49 */
II(ref d, a, b, c, x[k + ], S42, 0x432aff97); /* 50 */
II(ref c, d, a, b, x[k + ], S43, 0xab9423a7); /* 51 */
II(ref b, c, d, a, x[k + ], S44, 0xfc93a039); /* 52 */
II(ref a, b, c, d, x[k + ], S41, 0x655b59c3); /* 53 */
II(ref d, a, b, c, x[k + ], S42, 0x8f0ccc92); /* 54 */
II(ref c, d, a, b, x[k + ], S43, 0xffeff47d); /* 55 */
II(ref b, c, d, a, x[k + ], S44, 0x85845dd1); /* 56 */
II(ref a, b, c, d, x[k + ], S41, 0x6fa87e4f); /* 57 */
II(ref d, a, b, c, x[k + ], S42, 0xfe2ce6e0); /* 58 */
II(ref c, d, a, b, x[k + ], S43, 0xa3014314); /* 59 */
II(ref b, c, d, a, x[k + ], S44, 0x4e0811a1); /* 60 */
II(ref a, b, c, d, x[k + ], S41, 0xf7537e82); /* 61 */
II(ref d, a, b, c, x[k + ], S42, 0xbd3af235); /* 62 */
II(ref c, d, a, b, x[k + ], S43, 0x2ad7d2bb); /* 63 */
II(ref b, c, d, a, x[k + ], S44, 0xeb86d391); /* 64 */ A += a;
B += b;
C += c;
D += d;
}
return new UInt32[] { A, B, C, D };
}
public static byte[] MD5Array(byte[] input)
{
MD5_Init();
UInt32[] block = MD5_Append(input);
UInt32[] bits = MD5_Trasform(block); /* Encodes bits (UInt32[]) into output (byte[]). Assumes len is
* a multiple of 4.
*/
byte[] output = new byte[bits.Length * ];
for (int i = , j = ; i < bits.Length; i++, j += )
{
output[j] = (byte)(bits[i] & 0xff);
output[j + ] = (byte)((bits[i] >> ) & 0xff);
output[j + ] = (byte)((bits[i] >> ) & 0xff);
output[j + ] = (byte)((bits[i] >> ) & 0xff);
}
return output;
} public static string ArrayToHexString(byte[] array, bool uppercase)
{
string hexString = "";
string format = "x2";
if (uppercase)
{
format = "X2";
}
foreach (byte b in array)
{
hexString += b.ToString(format);
}
return hexString;
} public static string MDString(string message)
{
char[] c = message.ToCharArray();
byte[] b = new byte[c.Length];
for (int i = ; i < c.Length; i++)
{
b[i] = (byte)c[i];
}
byte[] digest = MD5Array(b);
return ArrayToHexString(digest, false);
}
}
string testMd5()
{ string conc = "StringBuilder sb = new StringBuilder(1024);StringBuilder sb = new StringBuilder(1024);StringBuilder sb = new StringBuilder(1024);StringBuilder sb = new StringBuilder(1024);";
conc = conc + conc + conc + conc + conc + conc + conc + conc;
string about = "";
for (int i = ; i < ; i++ )
{
about = MD5.MDString(conc);
}
return about;
}
private void button1_Click(object sender, EventArgs e)
{
DateTime fbeforDT = System.DateTime.Now;
fibonacci();
DateTime fafterDT = System.DateTime.Now;
TimeSpan ts = fafterDT.Subtract(fbeforDT);
textBox1.Text = string.Format("fibonacci spend: {0}ms.", ts.TotalMilliseconds); DateTime nbeforDT = System.DateTime.Now;
numberConvert();
DateTime nafterDT = System.DateTime.Now;
TimeSpan nts = nafterDT.Subtract(nbeforDT);
textBox2.Text = string.Format("numberConvert spend: {0}ms.", nts.TotalMilliseconds); DateTime sbeforDT = System.DateTime.Now;
stringAppend();
DateTime safterDT = System.DateTime.Now;
TimeSpan sts = safterDT.Subtract(sbeforDT);
textBox3.Text = string.Format("stringAppend spend: {0}ms.", sts.TotalMilliseconds); DateTime mbeforDT = System.DateTime.Now;
testMd5();
DateTime mafterDT = System.DateTime.Now;
TimeSpan mts = mafterDT.Subtract(mbeforDT);
textBox4.Text = string.Format("testMd5 spend: {0}ms.", mts.TotalMilliseconds); }
} }
这是C#编译出来Release的页面:
这是Snapman系统中写的TCC脚本代码:
int fibonacci(int n)
{
if(n==||n==)
return ;
return fibonacci(n-) + fibonacci(n-);
}
char* numberConvert()
{
char* result = (char*)malloc();
for (int i = ; i < ; i++ )
{
itoa(i,result,);
}
return result;
}
char* stringAppend()
{
char* conc = "StringBuilder sb = new StringBuilder(1024);";
char* sb = (char*)malloc();
int len = , cl = strlen(conc), curlen = ;
for (int i = ; i < ; i++)
{
free(sb);
len = ;
curlen = ;
sb = (char*)malloc();
for(int j = ; j < ; j++)
{
if(curlen + cl > len)
{
sb = (char*)realloc(sb,len*);
len *= ;
}
memcpy(sb+curlen,conc,cl);
curlen += cl;
}
}
sb[curlen] = ;
return sb;
} #define S11 7
#define S12 12
#define S13 17
#define S14 22
#define S21 5
#define S22 9
#define S23 14
#define S24 20
#define S31 4
#define S32 11
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21 static unsigned char PADDING[] = {
0x80, , , , , , , , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , , , ,
}; #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z))) #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) #define FF(a, b, c, d, x, s, ac) { (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }
#define GG(a, b, c, d, x, s, ac) { (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }
#define HH(a, b, c, d, x, s, ac) { (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }
#define II(a, b, c, d, x, s, ac) { (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } typedef unsigned char *POINTER;
typedef unsigned short int UINT2;
typedef unsigned long int UINT4;
typedef struct
{
UINT4 state[];
UINT4 count[];
unsigned char buffer[];
} MD5_CTX; void Encode(unsigned char *output, UINT4 *input, unsigned int len)
{
unsigned int i, j; for (i = , j = ; j < len; i++, j += ) {
output[j] = (unsigned char)(input[i] & 0xff);
output[j+] = (unsigned char)((input[i] >> ) & 0xff);
output[j+] = (unsigned char)((input[i] >> ) & 0xff);
output[j+] = (unsigned char)((input[i] >> ) & 0xff);
}
} void Decode(UINT4 *output, unsigned char *input, unsigned int len)
{
unsigned int i, j; for (i = , j = ; j < len; i++, j += )
{
output[i] = ((UINT4)input[j]) | (((UINT4)input[j+]) << ) |
(((UINT4)input[j+]) << ) | (((UINT4)input[j+]) << );
}
} void MD5Transform (UINT4 state[], unsigned char block[])
{
UINT4 a = state[], b = state[], c = state[], d = state[], x[];
Decode (x, block, );
FF (a, b, c, d, x[ ], S11, 0xd76aa478); /* 1 */
FF (d, a, b, c, x[ ], S12, 0xe8c7b756); /* 2 */
FF (c, d, a, b, x[ ], S13, 0x242070db); /* 3 */
FF (b, c, d, a, x[ ], S14, 0xc1bdceee); /* 4 */
FF (a, b, c, d, x[ ], S11, 0xf57c0faf); /* 5 */
FF (d, a, b, c, x[ ], S12, 0x4787c62a); /* 6 */
FF (c, d, a, b, x[ ], S13, 0xa8304613); /* 7 */
FF (b, c, d, a, x[ ], S14, 0xfd469501); /* 8 */
FF (a, b, c, d, x[ ], S11, 0x698098d8); /* 9 */
FF (d, a, b, c, x[ ], S12, 0x8b44f7af); /* 10 */
FF (c, d, a, b, x[], S13, 0xffff5bb1); /* 11 */
FF (b, c, d, a, x[], S14, 0x895cd7be); /* 12 */
FF (a, b, c, d, x[], S11, 0x6b901122); /* 13 */
FF (d, a, b, c, x[], S12, 0xfd987193); /* 14 */
FF (c, d, a, b, x[], S13, 0xa679438e); /* 15 */
FF (b, c, d, a, x[], S14, 0x49b40821); /* 16 */
GG (a, b, c, d, x[ ], S21, 0xf61e2562); /* 17 */
GG (d, a, b, c, x[ ], S22, 0xc040b340); /* 18 */
GG (c, d, a, b, x[], S23, 0x265e5a51); /* 19 */
GG (b, c, d, a, x[ ], S24, 0xe9b6c7aa); /* 20 */
GG (a, b, c, d, x[ ], S21, 0xd62f105d); /* 21 */
GG (d, a, b, c, x[], S22, 0x2441453); /* 22 */
GG (c, d, a, b, x[], S23, 0xd8a1e681); /* 23 */
GG (b, c, d, a, x[ ], S24, 0xe7d3fbc8); /* 24 */
GG (a, b, c, d, x[ ], S21, 0x21e1cde6); /* 25 */
GG (d, a, b, c, x[], S22, 0xc33707d6); /* 26 */
GG (c, d, a, b, x[ ], S23, 0xf4d50d87); /* 27 */
GG (b, c, d, a, x[ ], S24, 0x455a14ed); /* 28 */
GG (a, b, c, d, x[], S21, 0xa9e3e905); /* 29 */
GG (d, a, b, c, x[ ], S22, 0xfcefa3f8); /* 30 */
GG (c, d, a, b, x[ ], S23, 0x676f02d9); /* 31 */
GG (b, c, d, a, x[], S24, 0x8d2a4c8a); /* 32 */
HH (a, b, c, d, x[ ], S31, 0xfffa3942); /* 33 */
HH (d, a, b, c, x[ ], S32, 0x8771f681); /* 34 */
HH (c, d, a, b, x[], S33, 0x6d9d6122); /* 35 */
HH (b, c, d, a, x[], S34, 0xfde5380c); /* 36 */
HH (a, b, c, d, x[ ], S31, 0xa4beea44); /* 37 */
HH (d, a, b, c, x[ ], S32, 0x4bdecfa9); /* 38 */
HH (c, d, a, b, x[ ], S33, 0xf6bb4b60); /* 39 */
HH (b, c, d, a, x[], S34, 0xbebfbc70); /* 40 */
HH (a, b, c, d, x[], S31, 0x289b7ec6); /* 41 */
HH (d, a, b, c, x[ ], S32, 0xeaa127fa); /* 42 */
HH (c, d, a, b, x[ ], S33, 0xd4ef3085); /* 43 */
HH (b, c, d, a, x[ ], S34, 0x4881d05); /* 44 */
HH (a, b, c, d, x[ ], S31, 0xd9d4d039); /* 45 */
HH (d, a, b, c, x[], S32, 0xe6db99e5); /* 46 */
HH (c, d, a, b, x[], S33, 0x1fa27cf8); /* 47 */
HH (b, c, d, a, x[ ], S34, 0xc4ac5665); /* 48 */
II (a, b, c, d, x[ ], S41, 0xf4292244); /* 49 */
II (d, a, b, c, x[ ], S42, 0x432aff97); /* 50 */
II (c, d, a, b, x[], S43, 0xab9423a7); /* 51 */
II (b, c, d, a, x[ ], S44, 0xfc93a039); /* 52 */
II (a, b, c, d, x[], S41, 0x655b59c3); /* 53 */
II (d, a, b, c, x[ ], S42, 0x8f0ccc92); /* 54 */
II (c, d, a, b, x[], S43, 0xffeff47d); /* 55 */
II (b, c, d, a, x[ ], S44, 0x85845dd1); /* 56 */
II (a, b, c, d, x[ ], S41, 0x6fa87e4f); /* 57 */
II (d, a, b, c, x[], S42, 0xfe2ce6e0); /* 58 */
II (c, d, a, b, x[ ], S43, 0xa3014314); /* 59 */
II (b, c, d, a, x[], S44, 0x4e0811a1); /* 60 */
II (a, b, c, d, x[ ], S41, 0xf7537e82); /* 61 */
II (d, a, b, c, x[], S42, 0xbd3af235); /* 62 */
II (c, d, a, b, x[ ], S43, 0x2ad7d2bb); /* 63 */
II (b, c, d, a, x[ ], S44, 0xeb86d391); /* 64 */
state[] += a;
state[] += b;
state[] += c;
state[] += d;
memset ((POINTER)x, , sizeof (x));
} void MD5Init(MD5_CTX *context)
{
context->count[] = context->count[] = ;
context->state[] = 0x67452301;
context->state[] = 0xefcdab89;
context->state[] = 0x98badcfe;
context->state[] = 0x10325476;
} void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputLen)
{
unsigned int i, index, partLen; index = (unsigned int)((context->count[] >> ) & 0x3F);
if ((context->count[] += ((UINT4)inputLen << )) < ((UINT4)inputLen << ))
context->count[]++;
context->count[] += ((UINT4)inputLen >> );
partLen = - index;
if (inputLen >= partLen)
{
memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen);
MD5Transform(context->state, context->buffer); for (i = partLen; i + < inputLen; i += )
MD5Transform (context->state, &input[i]);
index = ;
}
else
{
i = ;
} memcpy((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen-i);
} void MD5Final(unsigned char digest[], MD5_CTX *context)
{
unsigned char bits[];
unsigned int index, padLen; Encode (bits, context->count, );
index = (unsigned int)((context->count[] >> ) & 0x3f);
padLen = (index < ) ? ( - index) : ( - index);
MD5Update (context, PADDING, padLen);
MD5Update (context, bits, );
Encode (digest, context->state, );
memset ((POINTER)context, , sizeof (*context));
} void MD5Digest(char *pszInput, unsigned long nInputSize, char *pszOutPut)
{
MD5_CTX context;
unsigned int len = strlen (pszInput);
MD5Init (&context);
MD5Update (&context, (unsigned char *)pszInput, len);
MD5Final ((unsigned char *)pszOutPut, &context);
} char* MD5Buffer( const char *pszInput, UINT nInputSize )
{
char szDigest[];
char* szResult = (char*)malloc();
memset(szResult,,);
MD5_CTX context;
MD5Init (&context);
MD5Update (&context, (unsigned char *)pszInput, nInputSize);
MD5Final ((unsigned char *)szDigest, &context);
int i;
for (i=;i<;i++) sprintf (szResult+strlen(szResult),"%02X",(unsigned char)szDigest[i]);
return szResult;
}
char* testMd5()
{
char* conc = "StringBuilder sb = new StringBuilder(1024);StringBuilder sb = new StringBuilder(1024);StringBuilder sb = new StringBuilder(1024);StringBuilder sb = new StringBuilder(1024);";
char* p = (char*)malloc();
char* about = NULL;
int len = ;
memset(p,,);
strcat(p,conc);
strcat(p,conc);
strcat(p,conc);
strcat(p,conc);
strcat(p,conc);
strcat(p,conc);
strcat(p,conc);
strcat(p,conc);
len = strlen(p);
for (int i = ; i < ; i++ )
{
if(about)free(about);
about = MD5Buffer(p,len);
}
return about;
}
void main()
{
int starTicc = GetTickCount();
fibonacci();
wPrint(L"fibonacci spend: %dms",GetTickCount() - starTicc); starTicc = GetTickCount();
free(numberConvert());
wPrint(L"numberConvert spend: %dms",GetTickCount() - starTicc); starTicc = GetTickCount();
free(stringAppend());
wPrint(L"stringAppend spend: %dms",GetTickCount() - starTicc); starTicc = GetTickCount();
free(testMd5());
wPrint(L"testMd5 spend: %dms",GetTickCount() - starTicc);
}
这是Snapman页面:
两种代码的设计和实现方法完全一样,其运行结果对比:
C#执行结果:
Snapman执行结果:
结论:
1、函数执行C#要比Snapman慢一些
2、数字转换C#要比Snapman慢一倍多
3、字符串叠加C#使用了最高效的StringBuilder,执行速度和Snapman差不多
4、执行Md5算法,C#就要比Snapman慢了11倍
所以Snapman的脚本运行速度是非常快速的。
Snapman的主页:http://www.snapman.xyz
Snapman系统中TCC执行效率和C#执行效率对比的更多相关文章
- .net core 部署到windows上的方法与 系统中相关问题的解决
前言 Net core 项目部门在Windows有很多种方式,大致有以下几种, dotnet 命令, iis(windowshosts), 一些开源的应用容器(docker ) 基于一些exe 程序, ...
- PowerShell因为在此系统中禁止执行脚本解决方法
PowerShell因为在此系统中禁止执行脚本解决方法 在Powershell直接脚本时会出现: 无法加载文件 ******.ps1,因为在此系统中禁止执行脚本.有关详细信息,请参阅 " ...
- 1)实际时间(real time): 从command命令行开始执行到运行终止的消逝时间; 2)用户CPU时间(user CPU time): 命令执行完成花费的用户CPU时间,即命令在用户态中执行时间总和; 3)系统CPU时间(system CPU time): 命令执行完成花费的系统CPU时
1)实际时间(real time): 从command命令行开始执行到运行终止的消逝时间: 2)用户CPU时间(user CPU time): 命令执行完成花费的用户CPU时间,即命令在用户态中执行时 ...
- 执行 vue inspect > output.js 报错,无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\vue.ps1,因为在此系统中禁止执行脚本
无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\vue.ps1,因为在此系统中禁止执行脚本.有关详细信息,请参阅 "get-help ab ...
- 无法加载文件 **.ps1,系统中禁止执行脚本
控制台执行命令后出现 无法加载文件 ******.ps1,因为在此系统中禁止执行脚本.有关详细信息,请参阅 "get-help about_signing" 在控制台执行命令: s ...
- 技术分析 | 浅谈在MySQL体系下SQL语句是如何在系统中执行的及可能遇到的问题
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 SQL语句大家并不陌生,但某种程度上来看,我们只是知道了这条语句是什么功能,它可 ...
- 李学斌:论复杂系统中的应用间协作V3
说明 本文主要讨论了巨型复杂业务系统的一种构建思路,力图实现决策意志的快速.准确.一致的下传并简化实施成本提供实施效率.通过全业务领域的即时流程编排,实现全网业务IT系统的快速建设与迭代.本文所讲的方 ...
- LINUX系统中动态链接库的创建与使用
大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部 ...
- LINUX系统中动态链接库的创建与使用{补充}
大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部 ...
随机推荐
- JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建
本篇博客就完整的来聊一下如何在Eclipse中创建的Maven Project.本篇博客是JavaEE开发的开篇,也是基础.本篇博客的内容干货还是比较多的,而且比较实用,并且都是采用目前最新版本的工具 ...
- Nuget私有服务搭建实战
最近更新了Nuget私有服务器的版本,之前是2.8.5,现在是2.11.3. Nuget服务器的搭建,这里有篇很详细的文章,跟着弄就好了: https://docs.microsoft.com/en- ...
- Vue 学习笔记 -- inline-template
简书 更方便的使用私有子组件 定义一个私有子组件时,如果子组件的template过长会使得代码非常难以阅读 这时可以使用内联模版 但是如果写成这样 为毛用要子组件呢?
- ubuntu---网络管理
网络配置文件 在 /etc/network/interface auto eth0 iface eth0 inet static address x.x.x.x netmask 255.255.255 ...
- React 中的this.setState
在react中如何修改state中的数据 第一种写法:this.setState() 参数1:对象 需要修改的数据 参数2:回调 this.setState是一 ...
- logback.xml sql语句输出
在使用springBoot框架之后,日志配置文件变成了logback.xml,输出sql语句的方法为: <!-- 打印sql语句 --> <logger name="com ...
- css实现超出文本省略号的两个方法
方法一:适用于定宽高; <!DOCTYPE html> <html> <head lang="en"> <meta charset=&qu ...
- 说一说MVC的CSRF(三)
用途:防止CSRF(跨网站请求伪造). 用法:在View->Form表单中:<%:Html.AntiForgeryToken()%> 在Controller->Action动作 ...
- 华为oj之质数因子
题目: 质数因子 热度指数:5143 时间限制:1秒 空间限制:32768K 本题知识点: 排序 题目描述 功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 ...
- IntelliJ IDEA 导入新项目
在现有的idea中close project 关闭当前项目, 然后import project