Организационно-экономический раздел
Все расчеты в данном разделе будут выполнены согласно методологии описанной в [7].
Согласно исходным данным (Таблица 1) по подпрограмме "matrmultiply"
η2* = 3(двумерный массив А) + 3(двумерный массив B) +3(двумерный массив C) + 1(переменная l) + 1(переменная m) + 1(переменная n) = 12;
Таблица 1. Исходные данные
Количество вхождений |
Операторы |
Количество вхождений |
Операнды |
1 |
{} |
2 |
A |
5 |
for |
2 |
B |
5 |
() |
3 |
C |
7 |
= |
3 |
l |
12 |
; |
2 |
m |
5 |
< |
3 |
n |
5 |
++ |
9 |
i |
4 |
[] |
9 |
j |
12 |
, |
4 |
k |
1 |
* |
|
|
1 |
+= |
|
|
3 |
<> |
|
|
Расчет характеристик для одномодульной программы по исходным данным
1. Находим размер словаря операндов:
η2 ≈ η2* * log2 η2*. = 12 * log2 12 = 43
2. Находим общую длину функции:
Ν = 2* η2 * log2 η2 = 2 * 43 * log2 43 = 467 слов
3. Находим объем функции, приняв в первом приближении η1 = η2 :
V = Ν* log2 η = Ν* log2 2η2 = 467 * log2 (2*43) = 3001 бит
4. Находим потенциальный объем и уровень реализации функции
V* = (η2* + 2) * log2 (η2* + 2) = (12+2)* log2 (12+2) = 53 бит
L = V* / V = 116 / 10734 = 0,02
5. Находим календарное время программирования, считая число программистов в бригаде n = 1, а производительность ν = 30 команд в день:
Т = 3N / (8 nν) = 3 * 467 / (8 * 1 * 30) = 6 дней
6. Находим начальное количество ошибок:
Во = V / 1600 = 3001 / 1600 = 2
7. Находим наработку на отказ, приняв длительность отладки равной τ=T/2 и продолжительность работы 8 часов в день:
tH = τ / ln Во = 8 * T / (2 * ln Во ) = 8 * 5,8 /(2* ln 2 )= 34 часа
Расчет характеристик для одномодульной программы по результатам реализации
После реализации программы были определены словари операторов и операндов: количество операторов η1 = 12, количество операндов η2 =15.
1. Находим общую длину функции:
Ν= 0,91* η * log2 η =(12 + 15)* log2(12 + 15) =128
2. Находим объем функции, приняв в первом приближении η1 = η2 :
V = Ν* log2η =128 * log2(12 + 15) = 609 бит
3. Находим потенциальный объем и уровень реализации функции:
V* = (η2* + 2) * log2 (η2* + 2) = (12+2)* log2 (12+2) = 53 бит
L = V* / V = 53 / 609 =0,09
4. Находим календарное время программирования, считая число программистов в бригаде n = 1, а производительность ν = 30 команд в день:
Т = 3N / (8 nν) = 3 * 128 / (8 * 1 * 30) =2 дня
5. Находим начальное количество ошибок:
Во = V / 1600 = 609 / 1600 = 0
6. Находим наработку на отказ, приняв длительность отладки равной τ=T/2 и продолжительность работы 8 часов в день:
tH = τ / ln Во = 8 * T / (2 * ln Во ) = 8 * 9 /(2* ln 0,4 )
Величина наработки на отказ стремится к бесконечности. Это означает, что программа может работать бесконечно долго до появления ошибки.
Расчет характеристик для программы, состоящей из нескольких модулей
Выполним расчет по исходным данным в предположении, что программа будет разбита на несколько функций, т.к. число входных и выходных переменных одномодульной программы отличается от оптимального (η2опт* =8). Параметры всех функций будем считать одинаковыми.
1. Определим число уровней иерархии и количество функций программы
i = (log2 η2* )/ 3 + 1 = (log2 12) / 3 + 1 = 2;
k = η2* / 8 = 12 / 8 ≈ 2;
2. Рассчитаем длину программы из двух функций и длину одного модуля:
N =k ( 220 + log k) = 2 (220 + log 2) = 442 слова;
Nk = N / k = 442/ 2=221 слово;
3. Находим количество операндов программы из двух модулей и количество операндов в одном модуле
η2 = η2* log2 (η2* / k ) + k log2 k = 12*log2 (12/2) + 2 log2 2=33;
η2k = η2 / k = 33/2 = 17;
4. Рассчитаем объём программы из двух модулей и объем одного модуля
V = kNk * log2 2 η2k = 2* 221 *log2 (2*17) = 2249 бит
Vk = 2249 / 2 = 1125 бит
5. Находим потенциальный объем и уровень реализации программы:
V* = 3 (η2 k * + 2) * log2 (η2 k * + 2) =3 (12+2)* log2 (12+2) = 107 бит
L = V* / V = 102 / 3730 =0,048
6. Находим календарное время программирования, считая число программистов в бригаде n = 1, а производительность ν = 30 команд в день:
Т = 3N / (8 nν) = 3 *442 / (8 * 1 * 30) =6 дней
7. Находим начальное количество ошибок:
Во = V / 1600 = 2249 / 1600 = 1
Округлим значение Во до 1.
8. Находим наработку на отказ, приняв длительность отладки равной τ=T/2 и продолжительность работы 8 часов в день:
tH = τ / ln Во = 8 * T / (2 * ln Во ) = 8 * 6 /(2* ln 1,4 ) = 71 час
Из таблицы ниже (Таблица 4) видно, что для рассматриваемого случая лучше реализовать многомодульную программу. В этом случае уменьшаются длина и объем программы, а также календарное время программирования и начальное количество ошибок.
Таблица 2. Результаты расчетов для подпрограммы "matrmultiply"
Характеристики |
Одномодульная программа |
Многомо-дульная программа |
||
Расчет по исходным данным |
Расчет по реализации |
Реальные данные |
||
Количество операндов в краткой записи η2* |
12 |
|
|
12 |
Количество операторов η1 |
|
12 |
12 |
|
Количество операндов η2 |
43 |
16 |
16 |
33 |
Длина подпрограммы Ν, слов |
467 |
128 |
154 |
442 |
Объём подпрограммы V, битов |
3001 |
609 |
315 |
2249 |
Потенциальный объём подпрограммы V, битов |
53 |
53 |
- |
107 |
Уровень реализации подпрограммы |
0,02 |
0,09 |
- |
0,048 |
Календарное время программирования Т, дней |
6 |
2 |
1 |
6 |
Начальное количество ошибок Во, штук |
2 |
0 |
0 |
1 |
Начальная наработка на отказ tH, часов |
35 |
|
- |
71 |
Текст подпрограммы:
void matrmultiply(array<double,2>^A, array<double,2>^B, array<double,2>^C, int l, int m, int n)
{
for(int i=0; i<l; i++)
for(int j=0; j<n; j++)
C[i,j]=0.0;
for(int i=0; i<l; i++)
for(int j=0; j<n; j++)
for(int k=0; k<m; k++)
C[i,j]+=A[i,k]*B[k,j];
}
Расчет метрических характеристик для подпрограммы "LUP" - LUP разложения матрицы:
Таблица 3. Результаты расчетов для подпрограммы "LUP"
Характеристики |
Одномодульная программа |
||
Расчет по исходным данным |
Расчет по реализации |
Реальные данные |
|
Количество операндов в краткой записи η2* |
11 |
|
|
Количество операторов η1 |
|
19 |
19 |
Количество операндов η2 |
38 |
16 |
15 |
Длина подпрограммы Ν, слов |
399 |
180 |
272 |
Объём подпрограммы V, битов |
2493 |
923 |
1142 |
Потенциальный объём подпрограммы V, битов |
48 |
48 |
- |
Уровень реализации подпрограммы |
0,02 |
0,05 |
- |
Календарное время программирования Т, дней |
5 |
2 |
1 |
Начальное количество ошибок Во, штук |
2 |
1 |
2 |
Начальная наработка на отказ tH, часов |
29 |
0 |
- |
Текст подпрограммы:
bool LUP(array<double,2>^A, array<double,2>^C, array<double,2>^P, int n)
{
double tmp;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
C[i,j] = A[i,j];
for( int i = 0; i < n; i++)
P[i,i]=1.0;
for( int i = 0; i < n; i++ )
{
double pivotValue = 0;
int pivot = -1;
for( int row = i; row < n; row++ )
{
if( fabs(C[row,i]) > pivotValue )
{
pivotValue = fabs(C[row,i]);
pivot = row;
}
}
if( pivotValue == 0 )
{
MessageBox::Show("Ошибка! Матрица вырождена");
return false;
}
if( pivot != i )
{
for(int j = 0; j < n; j++)
{
P[pivot,j]=tmp;
P[pivot,j]=P[i,j];
P[i,j]=tmp;
}
for(int j = 0; j < n; j++)
{
C[pivot,j]=tmp;
C[pivot,j]=C[i,j];
C[i,j]=tmp;
}
}
for( int j = i+1; j < n; j++ )
{
C[j,i] /= C[i,i];
for( int k = i+1; k < n; k++ )
C[j,k] -= C[j,i] * C[i,k];
}
}
return true;
}
Расчет метрических характеристик для подпрограммы "vectmatrmultiply" перемножения вектора на матрицу:
Таблица 4. Результаты расчетов для подпрограммы "vectmatrmultiply"
Характеристики |
Одномодульная программа |
||
Расчет по исходным данным |
Расчет по реализации |
Реальные данные |
|
Количество операндов в краткой записи η2* |
11 |
|
|
Количество операторов η1 |
|
12 |
19 |
Количество операндов η2 |
38 |
13 |
15 |
Длина подпрограммы Ν, слов |
399 |
116 |
98 |
Объём подпрограммы V, битов |
2493 |
539 |
260 |
Потенциальный объём подпрограммы V, битов |
48 |
48 |
- |
Уровень реализации подпрограммы |
0,02 |
0,09 |
- |
Календарное время программирования Т, дней |
5 |
1 |
1 |
Начальное количество ошибок Во, штук |
2 |
0 |
0 |
Начальная наработка на отказ tH, часов |
29 |
0 |
- |
Текст подпрограммы:
void vectmatrmultiply(array<double>^A, array<double,2>^B, array<double,2>^C, int m, int n)
{
for(int i=0; i<m; i++)
C[i,1]=0.0;
for(int i=0; i<m; i++)
{
for(int k=0; k<n; k++)
C[i,1]+=A[i]*B[k,i];
}
}
Расчет метрических характеристик для подпрограммы "scalar" скалярного перемножения векторов:
Таблица 5. Результаты расчетов для подпрограммы "scalar"
Характеристики |
Одномодульная программа |
||
Расчет по исходным данным |
Расчет по реализации |
Реальные данные |
|
Количество операндов в краткой записи η2* |
8 |
|
|
Количество операторов η1 |
|
12 |
12 |
Количество операндов η2 |
24 |
9 |
9 |
Длина подпрограммы Ν, слов |
220 |
92 |
56 |
Объём подпрограммы V, битов |
1229 |
404 |
164 |
Потенциальный объём подпрограммы V, битов |
33 |
33 |
- |
Уровень реализации подпрограммы |
0,03 |
0,08 |
- |
Календарное время программирования Т, дней |
3 |
1 |
1 |
Начальное количество ошибок Во, штук |
1 |
0 |
0 |
Начальная наработка на отказ tH, часов |
0 |
0 |
- |
Текст подпрограммы:
double scalar(array<double>^A, array<double>^B, int n)
{
double sum = 0.0;
for(int i=0; i<n; i++)
sum+=A[i]*B[i];
return sum;
}
Имеющиеся расхождения между результатами расчетов и реальными данными связаны с тем, что рассчитанные значений являются статистическими. Они не могут являться абсолютными ориентирами при разработке ПО, т.к. не учитывают человеческий фактор.