如何从此Java程序获得解决方案来解决算法?
问题描述:
for(int=0; i<1,000,000; i++)
{
if(data[i]< 0)
data[i]= data[i] * 2;
}
我想知道的是它可以计算出该算法如下如果所花费的时间来执行一个内存访问是100纳秒,并且所有其他操作的绝对速度(算术,注册访问等)需要10纳秒?我很确定这个问题可以用来计算绝对速度。我知道我们确实有一个变量已经是Ta = 100纳秒了,对吗?剩下的缺失变量可以通过我在Java程序中编译完成后提供的代码行来找到?我编译并运行它,但没有说明我需要解决这个问题。有什么建议么?
这里是我使用来计算该算法的绝对速度公式:
T=Tna X Nna + Ta X Na;
Tna= the time to execute a memory nonaccess instruction;
Nna= the number of memory nonaccess machine language instructions executed;
Ta= the time to execute a memory access instruction;
Na= the number of memory access machine language instructions executed;
这里是我将编译和运行,看它是否会给出一些丢失的变量的代码,我需要解决这个问题。
答
@dorakta如果你关注代码块中操作的分类。以下可能是一个起点。
1行:对(INT = 0;我<百万;我++)在for循环
变量i,需要存储器存取和休息操作。 这executs 1,000,000次
您有:
1000000 times of
2 - memory access (1 read and 1 assign)
1 - compare
1 - incr (depends. It could be -> 1 read and 1 add)
3行:如果(数据[I] < 0)
数据[i]于if语句是一个存储器的参考和一个比较操作。 这executs 1,000,000次
您有:
1000000 times of
2 - memory access
1 - compare
4行:数据[I] =数据[I] * 2
您有:视的值0至1000000倍数据。 你可能想要计算最坏的情况。
Hence, 1000000 times.
2 - memory access (1 read and 1 assign)
1 multiply
希望它有帮助!
+0
非常感谢!由于T = Tna×Nna(10×1)+ Ta×Na(100×6),总绝对速度将为610秒; – dorakta
对我来说,找到“绝对速度”意味着你运行它,看看它花了多长时间。你有什么想法? –
@KevinAnderson这些步骤确定每行代码的指令类型,无论是内存访问还是非内存访问 然后,您需要确定每个代码执行的次数。 然后您将每个访问的总数加起来 给予两次:每个内存访问指令为100纳秒,每个非内存访问为10纳秒。 – dorakta
因此,“代码行”是指Java代码还是编译的字节码? –