优化 Java 卡上的代码序列
Optimize code sequence on Java Card
我正在尝试对 Java 卡实施 BCH 代码更正。我已经实现了 encode
函数,现在我正在解码 input.My 结果似乎是正确的,但是花在 decode
函数上的时间非常 large.I 弄清楚了序列下面给出的代码是最耗时的。
Util.arrayCopy(data, OFFSET_START, transientMemory, OFFSET_START,LENGTH);
short i, j, u, q, t2, count = 0, syn_error = 0;
t2 = (short) (2 * T);
for (i = 1; i <= t2; i++)
{
for (j = 0; j < LENGTH; j++)
if (transientMemory[j] != 0)
{
short t = (short)(i*j);
if(t < 0) // (i*j > 32767 )
{
t &= (short)0x7FFF;
t += 64; // hack because n is always 511
}
t %= n;
s[i] ^= ALPHA_TO[t]; // stored in EEPROM
}
if (s[i] != 0)
syn_error = 1;
s[i] = (short) INDEX_OF[s[i]]; //stored in EEPROM
}
Util.arrayCopy(transientMemory, OFFSET_START, data, OFFSET_START,LENGTH);
ISOException.throwIt(ISO7816.SW_CORRECT_LENGTH_00); // for stopping the program
我为byte[]
预分配了两个RAM缓冲区transientMemory
,为short[]
预分配了temp_ram
但是时间似乎执行时间仍然很长(370
s ) .本例中t2
的值为104
,LENGTH
的值为386
。有什么方法可以使这段代码更好地工作
我设法通过在 RAM 中存储一些变量而不是 EEPROM.Here 来优化我的代码
byte[] transientMemory = p_Memory.geByteRam();
short[] temp_ram = p_Memory.getShortRam();
short index = 0;
for(; index < n ; index++)
temp_ram[index]=ALPHA_TO[index];
Util.arrayCopyNonAtomic(data, OFFSET_START, transientMemory, OFFSET_START,LENGTH);
short i, j, u, q, t2, count = 0, syn_error = 0,s_local=0;
t2 = (short) (2 * T);
for (i = 1; i <= t2; i++)
{
s_local = s[i];
for (j = 0; j < LENGTH; j++)
if (transientMemory[j] != 0)
{
short t = (short)(i*j);
if(t < 0) // (i*j > 32767 )
{
t &= (short)0x7FFF;
t += 64; // hack because n is always 511
}
t %= n;
s_local ^= temp_ram[t];
}
if (s_local != 0)
syn_error = 1;
s[i] = (short) INDEX_OF[s_local];
}
for(; index < n ; index++)
ALPHA_TO[index]=temp_ram[index];
现在执行时间似乎接近45s
。
你可以使用一些强度降低。某些低端 CPU 的乘法和除法成本很高,所以我会替换
short t = (short)(i*j);
由t += i
在内部循环之前将其声明为short t = 0
之后。
如果我理解正确的话
if(t < 0) // (i*j > 32767 )
{
t &= (short)0x7FFF;
t += 64; // hack because n is always 511
}
t %= n;
如果 t
是 int
,它的作用与 t %= 511
相同。由于 t
必须适合无符号短,假设普通 Java 你可以写
t += (t & 511) + ((t >>> 9) & 63);
if (t >= 511) t -= 511;
不知道如何将其转换为您需要的内容,因为我不知道如何表达 short
的移位(在普通的 Java 中,移位操作数被提升为 int
).它可能像我写的那样工作...
我正在尝试对 Java 卡实施 BCH 代码更正。我已经实现了 encode
函数,现在我正在解码 input.My 结果似乎是正确的,但是花在 decode
函数上的时间非常 large.I 弄清楚了序列下面给出的代码是最耗时的。
Util.arrayCopy(data, OFFSET_START, transientMemory, OFFSET_START,LENGTH);
short i, j, u, q, t2, count = 0, syn_error = 0;
t2 = (short) (2 * T);
for (i = 1; i <= t2; i++)
{
for (j = 0; j < LENGTH; j++)
if (transientMemory[j] != 0)
{
short t = (short)(i*j);
if(t < 0) // (i*j > 32767 )
{
t &= (short)0x7FFF;
t += 64; // hack because n is always 511
}
t %= n;
s[i] ^= ALPHA_TO[t]; // stored in EEPROM
}
if (s[i] != 0)
syn_error = 1;
s[i] = (short) INDEX_OF[s[i]]; //stored in EEPROM
}
Util.arrayCopy(transientMemory, OFFSET_START, data, OFFSET_START,LENGTH);
ISOException.throwIt(ISO7816.SW_CORRECT_LENGTH_00); // for stopping the program
我为byte[]
预分配了两个RAM缓冲区transientMemory
,为short[]
预分配了temp_ram
但是时间似乎执行时间仍然很长(370
s ) .本例中t2
的值为104
,LENGTH
的值为386
。有什么方法可以使这段代码更好地工作
我设法通过在 RAM 中存储一些变量而不是 EEPROM.Here 来优化我的代码
byte[] transientMemory = p_Memory.geByteRam();
short[] temp_ram = p_Memory.getShortRam();
short index = 0;
for(; index < n ; index++)
temp_ram[index]=ALPHA_TO[index];
Util.arrayCopyNonAtomic(data, OFFSET_START, transientMemory, OFFSET_START,LENGTH);
short i, j, u, q, t2, count = 0, syn_error = 0,s_local=0;
t2 = (short) (2 * T);
for (i = 1; i <= t2; i++)
{
s_local = s[i];
for (j = 0; j < LENGTH; j++)
if (transientMemory[j] != 0)
{
short t = (short)(i*j);
if(t < 0) // (i*j > 32767 )
{
t &= (short)0x7FFF;
t += 64; // hack because n is always 511
}
t %= n;
s_local ^= temp_ram[t];
}
if (s_local != 0)
syn_error = 1;
s[i] = (short) INDEX_OF[s_local];
}
for(; index < n ; index++)
ALPHA_TO[index]=temp_ram[index];
现在执行时间似乎接近45s
。
你可以使用一些强度降低。某些低端 CPU 的乘法和除法成本很高,所以我会替换
short t = (short)(i*j);
由t += i
在内部循环之前将其声明为short t = 0
之后。
如果我理解正确的话
if(t < 0) // (i*j > 32767 )
{
t &= (short)0x7FFF;
t += 64; // hack because n is always 511
}
t %= n;
如果 t
是 int
,它的作用与 t %= 511
相同。由于 t
必须适合无符号短,假设普通 Java 你可以写
t += (t & 511) + ((t >>> 9) & 63);
if (t >= 511) t -= 511;
不知道如何将其转换为您需要的内容,因为我不知道如何表达 short
的移位(在普通的 Java 中,移位操作数被提升为 int
).它可能像我写的那样工作...