Skip to content

Commit 6071a92

Browse files
committed
Improve performance on struct
1 parent 74ba84d commit 6071a92

File tree

1 file changed

+61
-67
lines changed

1 file changed

+61
-67
lines changed

Src/IronPython.Modules/_struct.cs

Lines changed: 61 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public Struct(params object[] args) {
6060
}
6161

6262
[Documentation("creates a new uninitialized struct object - all arguments are ignored")]
63-
public Struct([ParamDictionary]IDictionary<object, object> kwArgs, params object[] args) {
63+
public Struct([ParamDictionary] IDictionary<object, object> kwArgs, params object[] args) {
6464
}
6565

6666
[Documentation("initializes or re-initializes the compiled struct object with a new format")]
@@ -372,7 +372,6 @@ public void pack_into(CodeContext/*!*/ context, [NotNone] ByteArray/*!*/ buffer,
372372
System.Diagnostics.Debug.Assert(res_idx == res.Length);
373373

374374
return PythonTuple.MakeTuple(res);
375-
376375
}
377376

378377
public PythonTuple/*!*/ unpack(CodeContext/*!*/ context, [NotNone] ArrayModule.array/*!*/ buffer)
@@ -1207,16 +1206,16 @@ private static void CheckRange(CodeContext context, int val, int min, int max, s
12071206
#region Data creater helpers
12081207

12091208
internal static bool CreateBoolValue(CodeContext/*!*/ context, ref int index, IList<byte> data) {
1210-
return (int)ReadData(context, ref index, data) != 0;
1209+
return data[index++] != 0;
12111210
}
12121211

12131212
internal static byte CreateCharValue(CodeContext/*!*/ context, ref int index, IList<byte> data) {
1214-
return ReadData(context, ref index, data);
1213+
return data[index++];
12151214
}
12161215

12171216
internal static short CreateShortValue(CodeContext/*!*/ context, ref int index, bool fLittleEndian, IList<byte> data) {
1218-
byte b1 = (byte)ReadData(context, ref index, data);
1219-
byte b2 = (byte)ReadData(context, ref index, data);
1217+
byte b1 = data[index++];
1218+
byte b2 = data[index++];
12201219

12211220
if (fLittleEndian) {
12221221
return (short)((b2 << 8) | b1);
@@ -1226,8 +1225,8 @@ internal static short CreateShortValue(CodeContext/*!*/ context, ref int index,
12261225
}
12271226

12281227
internal static ushort CreateUShortValue(CodeContext/*!*/ context, ref int index, bool fLittleEndian, IList<byte> data) {
1229-
byte b1 = (byte)ReadData(context, ref index, data);
1230-
byte b2 = (byte)ReadData(context, ref index, data);
1228+
byte b1 = data[index++];
1229+
byte b2 = data[index++];
12311230

12321231
if (fLittleEndian) {
12331232
return (ushort)((b2 << 8) | b1);
@@ -1238,16 +1237,16 @@ internal static ushort CreateUShortValue(CodeContext/*!*/ context, ref int index
12381237

12391238
internal static float CreateFloatValue(CodeContext/*!*/ context, ref int index, bool fLittleEndian, IList<byte> data) {
12401239
byte[] bytes = new byte[4];
1241-
if (fLittleEndian) {
1242-
bytes[0] = (byte)ReadData(context, ref index, data);
1243-
bytes[1] = (byte)ReadData(context, ref index, data);
1244-
bytes[2] = (byte)ReadData(context, ref index, data);
1245-
bytes[3] = (byte)ReadData(context, ref index, data);
1240+
if (fLittleEndian == BitConverter.IsLittleEndian) {
1241+
bytes[0] = data[index++];
1242+
bytes[1] = data[index++];
1243+
bytes[2] = data[index++];
1244+
bytes[3] = data[index++];
12461245
} else {
1247-
bytes[3] = (byte)ReadData(context, ref index, data);
1248-
bytes[2] = (byte)ReadData(context, ref index, data);
1249-
bytes[1] = (byte)ReadData(context, ref index, data);
1250-
bytes[0] = (byte)ReadData(context, ref index, data);
1246+
bytes[3] = data[index++];
1247+
bytes[2] = data[index++];
1248+
bytes[1] = data[index++];
1249+
bytes[0] = data[index++];
12511250
}
12521251
float res = BitConverter.ToSingle(bytes, 0);
12531252

@@ -1261,10 +1260,10 @@ internal static float CreateFloatValue(CodeContext/*!*/ context, ref int index,
12611260
}
12621261

12631262
internal static int CreateIntValue(CodeContext/*!*/ context, ref int index, bool fLittleEndian, IList<byte> data) {
1264-
byte b1 = (byte)ReadData(context, ref index, data);
1265-
byte b2 = (byte)ReadData(context, ref index, data);
1266-
byte b3 = (byte)ReadData(context, ref index, data);
1267-
byte b4 = (byte)ReadData(context, ref index, data);
1263+
byte b1 = data[index++];
1264+
byte b2 = data[index++];
1265+
byte b3 = data[index++];
1266+
byte b4 = data[index++];
12681267

12691268
if (fLittleEndian)
12701269
return (int)((b4 << 24) | (b3 << 16) | (b2 << 8) | b1);
@@ -1273,10 +1272,10 @@ internal static int CreateIntValue(CodeContext/*!*/ context, ref int index, bool
12731272
}
12741273

12751274
internal static uint CreateUIntValue(CodeContext/*!*/ context, ref int index, bool fLittleEndian, IList<byte> data) {
1276-
byte b1 = (byte)ReadData(context, ref index, data);
1277-
byte b2 = (byte)ReadData(context, ref index, data);
1278-
byte b3 = (byte)ReadData(context, ref index, data);
1279-
byte b4 = (byte)ReadData(context, ref index, data);
1275+
byte b1 = data[index++];
1276+
byte b2 = data[index++];
1277+
byte b3 = data[index++];
1278+
byte b4 = data[index++];
12801279

12811280
if (fLittleEndian)
12821281
return (uint)((b4 << 24) | (b3 << 16) | (b2 << 8) | b1);
@@ -1285,14 +1284,14 @@ internal static uint CreateUIntValue(CodeContext/*!*/ context, ref int index, bo
12851284
}
12861285

12871286
internal static long CreateLongValue(CodeContext/*!*/ context, ref int index, bool fLittleEndian, IList<byte> data) {
1288-
long b1 = (byte)ReadData(context, ref index, data);
1289-
long b2 = (byte)ReadData(context, ref index, data);
1290-
long b3 = (byte)ReadData(context, ref index, data);
1291-
long b4 = (byte)ReadData(context, ref index, data);
1292-
long b5 = (byte)ReadData(context, ref index, data);
1293-
long b6 = (byte)ReadData(context, ref index, data);
1294-
long b7 = (byte)ReadData(context, ref index, data);
1295-
long b8 = (byte)ReadData(context, ref index, data);
1287+
long b1 = data[index++];
1288+
long b2 = data[index++];
1289+
long b3 = data[index++];
1290+
long b4 = data[index++];
1291+
long b5 = data[index++];
1292+
long b6 = data[index++];
1293+
long b7 = data[index++];
1294+
long b8 = data[index++];
12961295

12971296
if (fLittleEndian)
12981297
return (long)((b8 << 56) | (b7 << 48) | (b6 << 40) | (b5 << 32) |
@@ -1303,14 +1302,14 @@ internal static long CreateLongValue(CodeContext/*!*/ context, ref int index, bo
13031302
}
13041303

13051304
internal static ulong CreateULongValue(CodeContext/*!*/ context, ref int index, bool fLittleEndian, IList<byte> data) {
1306-
ulong b1 = (byte)ReadData(context, ref index, data);
1307-
ulong b2 = (byte)ReadData(context, ref index, data);
1308-
ulong b3 = (byte)ReadData(context, ref index, data);
1309-
ulong b4 = (byte)ReadData(context, ref index, data);
1310-
ulong b5 = (byte)ReadData(context, ref index, data);
1311-
ulong b6 = (byte)ReadData(context, ref index, data);
1312-
ulong b7 = (byte)ReadData(context, ref index, data);
1313-
ulong b8 = (byte)ReadData(context, ref index, data);
1305+
ulong b1 = data[index++];
1306+
ulong b2 = data[index++];
1307+
ulong b3 = data[index++];
1308+
ulong b4 = data[index++];
1309+
ulong b5 = data[index++];
1310+
ulong b6 = data[index++];
1311+
ulong b7 = data[index++];
1312+
ulong b8 = data[index++];
13141313
if (fLittleEndian)
13151314
return (ulong)((b8 << 56) | (b7 << 48) | (b6 << 40) | (b5 << 32) |
13161315
(b4 << 24) | (b3 << 16) | (b2 << 8) | b1);
@@ -1321,24 +1320,24 @@ internal static ulong CreateULongValue(CodeContext/*!*/ context, ref int index,
13211320

13221321
internal static double CreateDoubleValue(CodeContext/*!*/ context, ref int index, bool fLittleEndian, IList<byte> data) {
13231322
byte[] bytes = new byte[8];
1324-
if (fLittleEndian) {
1325-
bytes[0] = (byte)ReadData(context, ref index, data);
1326-
bytes[1] = (byte)ReadData(context, ref index, data);
1327-
bytes[2] = (byte)ReadData(context, ref index, data);
1328-
bytes[3] = (byte)ReadData(context, ref index, data);
1329-
bytes[4] = (byte)ReadData(context, ref index, data);
1330-
bytes[5] = (byte)ReadData(context, ref index, data);
1331-
bytes[6] = (byte)ReadData(context, ref index, data);
1332-
bytes[7] = (byte)ReadData(context, ref index, data);
1323+
if (fLittleEndian == BitConverter.IsLittleEndian) {
1324+
bytes[0] = data[index++];
1325+
bytes[1] = data[index++];
1326+
bytes[2] = data[index++];
1327+
bytes[3] = data[index++];
1328+
bytes[4] = data[index++];
1329+
bytes[5] = data[index++];
1330+
bytes[6] = data[index++];
1331+
bytes[7] = data[index++];
13331332
} else {
1334-
bytes[7] = (byte)ReadData(context, ref index, data);
1335-
bytes[6] = (byte)ReadData(context, ref index, data);
1336-
bytes[5] = (byte)ReadData(context, ref index, data);
1337-
bytes[4] = (byte)ReadData(context, ref index, data);
1338-
bytes[3] = (byte)ReadData(context, ref index, data);
1339-
bytes[2] = (byte)ReadData(context, ref index, data);
1340-
bytes[1] = (byte)ReadData(context, ref index, data);
1341-
bytes[0] = (byte)ReadData(context, ref index, data);
1333+
bytes[7] = data[index++];
1334+
bytes[6] = data[index++];
1335+
bytes[5] = data[index++];
1336+
bytes[4] = data[index++];
1337+
bytes[3] = data[index++];
1338+
bytes[2] = data[index++];
1339+
bytes[1] = data[index++];
1340+
bytes[0] = data[index++];
13421341
}
13431342

13441343
double res = BitConverter.ToDouble(bytes, 0);
@@ -1354,30 +1353,25 @@ internal static double CreateDoubleValue(CodeContext/*!*/ context, ref int index
13541353
internal static Bytes CreateString(CodeContext/*!*/ context, ref int index, int count, IList<byte> data) {
13551354
using var res = new MemoryStream();
13561355
for (int i = 0; i < count; i++) {
1357-
res.WriteByte(ReadData(context, ref index, data));
1356+
res.WriteByte(data[index++]);
13581357
}
13591358
return Bytes.Make(res.ToArray());
13601359
}
13611360

13621361

13631362
internal static Bytes CreatePascalString(CodeContext/*!*/ context, ref int index, int count, IList<byte> data) {
1364-
int realLen = (int)ReadData(context, ref index, data);
1363+
int realLen = (int)data[index++];
13651364
using var res = new MemoryStream();
13661365
for (int i = 0; i < realLen; i++) {
1367-
res.WriteByte(ReadData(context, ref index, data));
1366+
res.WriteByte(data[index++]);
13681367
}
13691368
for (int i = realLen; i < count; i++) {
13701369
// throw away null bytes
1371-
ReadData(context, ref index, data);
1370+
index++;
13721371
}
13731372
return Bytes.Make(res.ToArray());
13741373
}
13751374

1376-
private static byte ReadData(CodeContext/*!*/ context, ref int index, IList<byte> data) {
1377-
if (index >= data.Count) throw Error(context, "not enough data while reading");
1378-
1379-
return data[index++];
1380-
}
13811375
#endregion
13821376

13831377
#region Misc. Private APIs

0 commit comments

Comments
 (0)