Програмын кодыг оновчтой болгох. Программист болон хөрвүүлэгчийн кодыг оновчтой болгох үндсэн шинж чанарууд

Заримдаа i++ эсвэл ++i гэсэн аль бүтэц нь илүү дээр вэ, эсвэл if-else болон switch-ийн хооронд сонголт хийхэд хэцүү байдаг. IT-ийн ажлын нийгэмлэгт тусгайлан зориулж бичсэн энэхүү нийтлэл нь мэргэжлийн програмист бүрийн мэдэх ёстой хамгийн бодит кодыг оновчтой болгох хэрэгслүүдийг толилуулж байна.

Зарим хүмүүс кодын түвшний оновчлолын өдрүүд үүрд алга болсон гэж боддог ч энэ нь үнэн биш юм. Одоо ийм хүчирхэг хөрвүүлэгч байхгүй олон платформууд байдаг Microsoft VisualСтуди. Жишээлбэл, шэйдер хэл (hlsl, glsl) эсвэл CUDA, PlayStation3, SPU эсвэл код. гар утасны платформууд. Кодын зохион байгуулалтаас хамааран түүний үр ашиг нь заримдаа хөрвүүлэгчийн үр ашиггүй байдлаас шалтгаалан арав дахин ялгаатай байж болох ч санах ойн хандалтаас шалтгаална.

Өөр өөр платформ дээр программчлахдаа хөрвүүлэгчийнхээ чадвар, процессорын архитектурын онцлогийг (хэрэв та тодорхой консол дээр бичиж байгаа бол) судалж үзээрэй. Төрөл бүрийн оновчлолын гүйцэтгэлийн туршилтыг явуулах. Аль аргууд нь хамгийн үр дүнтэй болохыг таахад хэцүү байдаг. Мөн энэ нийтлэл танд тусалж болох янз бүрийн заль мэхийг танд хэлэх болно. Гэсэн хэдий ч, та урьдчилан дүн шинжилгээ хийх, профайл хийхгүйгээр сохроор оновчтой болгох ёсгүй. Эрт оновчлох нь муу зүйл гэдгийг санаарай.

Хэрэв та Windows дээр VS програмист бол хөрвүүлэгч нь тайлбарласан оновчлолын олон аргуудыг үр дүнтэй даван туулах болно. Санах ойтой ажиллах цэгүүдэд анхаарлаа хандуулаарай, мөн би танд техниктэй танилцахыг зөвлөж байна өгөгдөлд чиглэсэн дизайн. Үүнийг ашиглах зарим зөвлөмжийг нийтлэлээс хайж олоорой.

Ингээд эхэлцгээе:

1. Өгөгдлийн векторчлол болон вектор боловсруулах зааварчилгааг ашиглана уу (жишээ нь CPU дахь SSE эсвэл шэйдер эсвэл CUDA ашигладаг бол өгөгдлийг багцлах). Энэ нь SIMD (Single Instruction, Multiple Data) архитектурыг ашиглах боломжийг олгох бөгөөд энэ нь тооцооллын хурдыг ихээхэн нэмэгдүүлэх болно. Хэрэв та энэ аргыг ашиглахаар шийдсэн бол санах ойд өгөгдөл тохируулах талаар бүү мартаарай.

2. Эхлээд бүгдийг нэмээд дараа нь бүгдийг нь үржүүлснээс холимог хэлбэрээр нэмэх, үржүүлэх нь илүү үр дүнтэй байдаг. Учир нь нэмэх, үржүүлэх үйлдлийг өөр өөр процессорын модулиуд гүйцэтгэдэг бөгөөд нэгэн зэрэг гүйцэтгэх боломжтой.
int a,b,c,k,m,n,t,f1,f2,f3,g1,g2,g3; a = b + c; k = m + n; t = a + k; f1 = f2 * f3; g1 = g2 * g3; Үр ашиг багатай: a = b + c; f1 = f2 * f3; k = m + n; g1 = g2 * g3; t = a + k;

3. Хөвөгч, нэмэх, үржүүлэхэд давхар ажиллахад хурдны ялгаа байхгүй. Тэд ижил тооны процессорын циклээр ажиллаж, ижил регистрүүдийг ашигладаг. Хувааж, үндсийг нь авах үед хөвөх нь илүү хурдан байдаг. Гэсэн хэдий ч, хэрэв та их хэмжээний өгөгдөл ашигладаг бол кэшийн улмаас эзэлдэг төрөл санах ой бага(жишээ нь, хөвөх), тиймээс ерөнхийдөө үүнийг ашиглах нь дээр. Илүү нарийвчлал шаардлагатай үед давхар сонгох нь утга учиртай.

4.
Идэцгээе. const float a = 100.0f; float some1 = some3 * 1.0f/a; float some2 = some4 * 1.0f/a; бичихгүй байх нь илүү үр дүнтэй: const float a_inv = 1.0f / a; зарим1 = зарим3 * a_inv; some2 = some4 * a_inv; гэх мэт: зарим1 = зарим3 * (1.0f / a); зарим2 = зарим нь4 * (1.0f/a); Энэ нь яагаад илүү үр дүнтэй байх вэ? Тэнцүү давуу эрхтэй операторуудыг дараалан гүйцэтгэнэ. Энэ нь эхлээд үржүүлэх, дараа нь хуваах гэсэн үг юм. Хэрэв та хуваах үйлдлийг хаалтанд хийвэл хөрвүүлэгч үүнийг гүйцэтгэх бөгөөд бодит цаг хугацаанд зөвхөн үржүүлэх үйлдлийг гүйцэтгэх болно. 3-р сонголт ба 2-р хувилбарын ялгааны хувьд 3-р хувилбарт нэмэлт хувьсагч үүсгээгүй тул кодыг үзэхдээ энэ хувьсагч гэж юу болохыг бодох шаардлагагүй. Мөн 2, 3-р сонголтуудын үр нөлөө ижил байх болно.

5. Их хэмжээний өгөгдөл, тэдгээрийн тооцоолол дээр float нь хоёр дахин илүү ашигтай байдаг (кэш алдсаны улмаас 3-р зүйлийг үзнэ үү).

6.
a, b - дурын илэрхийлэл Func1, Func2 - нөхцөлийг тооцоолохын тулд дуудагдах функцууд if(a && b) - Хэрэв (a || b) илүү үр дүнтэй байхын тулд та магадлал багатай эхний нөхцөлийг тохируулах хэрэгтэй - та илүү үр дүнтэй бол if(Func1() && Func2()) бол хамгийн боломжит нөхцөлийг эхлээд тохируулаарай - та эхлээд хурдан операторыг тавих хэрэгтэй.

7.
void Func(int* a) ( int b = 10; Дараах мөрүүд нь адилхан үр дүнтэй (гүйцэтгэх хугацааны хувьд): b = 100; *a = 100; ) Энэ нь стекийн хувьсагч руу стек заагчаар ханддаг тул тохиолддог. Мөн заагч ялгавартай байдал байдаг.

8. Хэрэв олон тооны бүтэц байгаа бол түүний элементүүдийн хэмжээг хоёрын чадалтай тэнцүү болгох хэрэгтэй. Дараа нь массив дахь бүтэц бүрт заагчийг зэрэгцүүлснээр ийм массиваар дамжин өнгөрөх нь илүү хурдан (4-6 удаа) байх болно.

9.
int a[1000 ]; for(int i =0; i<1000; ++i) a[ i ] = 50; Значительно эффективнее будет: int* p = a; for(int i =0; i<1000; ++i, ++p) *p = 50;

10.
SomeClass*p; - элементийн массивын заагч х = *(p++); - илүү үр дүнтэй x = *(++p); 1-р цэгтэй ижил шалтгаанаар. Эхний тохиолдолд заагчийг параллель, хоёр дахь тохиолдолд дарааллаар нь хасч, нэмэгдүүлнэ.

11. Хоёр хэмжээст массивын баганын тоо нь хоёрын зэрэгтэй тэнцүү байх нь дээр. Энэ нь массивтай ажиллах хурдыг нэмэгдүүлэх болно. Энэ нь мөр бүрийн эхний элементүүдэд заагчийг зэрэгцүүлж, элементийн хандалтыг хурдасгах болно.
int mas[ 10 ][ 16 - баганын тоо хоёрын зэрэгтэй байвал зохимжтой]

12.
u32a; f32b; b = (f32)(i32)a; - илүү хурдан b = (f32)a;

13. Төрөл цутгахаас зайлсхий.
хөвөх f; int a; хөвөх b = (хөвөх)a; - long int m = (int)f; - маш удаан

14. Бөөрөнхийлөлтийг ухаалгаар ашиглах:
зөвхөн гарын үсэггүй: (u32)x нь "u32(floor(x))"-ээс 10 дахин хурдан u32(x + 1.0f) нь "u32(cell(x))"-ээс 10 дахин хурдан u32(x + 0.5f) "u32(round(x))"-ээс 10 дахин хурдан
15.
хөвөх f = 1.0f; *(int*)&f ^= 0x80000000; - f *= -1.0f-ээс хурдан;

16. Хэрэв шилжүүлэгчд кейсийн параметрүүдийн дараалсан утгыг ашигладаг бол (0-р тохиолдол: тохиолдол 1: тохиолдол 2:...) шилжүүлэгч нь if-else-ээс хамаагүй илүү үр дүнтэй байдаг. Энэ нь if-else-ийн тусламжтайгаар нөхцөл бүрийн утгыг тооцоолох бөгөөд шилжүүлэгчийн бүтцэд ийм параметр байгаа тохиолдолд утгыг нэг удаа тооцож, дараа нь хүссэн зүйл рүү нэн даруй шилжих болно. зүйл.

17. Салбарлах нь хорон муу юм. Тэдний тоог багасгахыг хичээ. Тэдгээрийг том гогцоонд хийж болохгүй. шилжүүлэгч нь мөн салбар юм. Процессор нь нөхцөл байдлын үр дүнг (салбарын таамаглал) урьдчилан таамаглахыг оролддог бөгөөд хэрэв илэрхийллийн утга бараг үргэлж ижил байвал салаалах нь кодын гүйцэтгэлийн хурдад нөлөөлөхгүй. Гэсэн хэдий ч ерөнхийдөө салбар таамаглал нь 50% буруу байх бөгөөд энэ нь алгоритмыг удаашруулна. Салбар бүр нь процессорын зааврын дараалал руу шилжих шилжилт юм. Ийм шилжилт нь процессорын заавар дамжуулах хоолойг эвдэж, нэлээд үнэтэй байдаг.

Энэ нь ялангуяа шэйдер, SPU дэд программууд, CUDA дэд программууд болон их хэмжээний өгөгдөл боловсруулж байгаа алгоритмуудад үнэн юм. Хэрэв та зуун мянган ширхэгийн кодыг ажиллуулах шаардлагатай бол салбаруудын тоог багасгахыг хичээ. Энэ нь кодын гүйцэтгэлийг мэдэгдэхүйц хурдасгах боломжтой.

Const int NN = 12500000; const int N = 10; дараах муу байна (миний машин дээр 200ms): for(int i = 0; i< NN; ++i) { switch(i % N) { case 0: res += 10; break; case 3: res += 30; break; case 5: res += 50; break; case 6: res += 60; break; case 8: res += 80; break; } } гораздо лучше (120 ms на моей машине): const int arr = { 10, 0, 0, 30, 0, 50, 60, 0, 80, 0 }; for(int i = 0; i < NN; ++i) res += arr[ i % N ];

18. Нэг жишээг авч үзье. 2D спрайт нь оройн массивыг агуулна[ 4 ]. Нэг оройг хадгалах, спрайт дээр эхний элементтэй харьцуулахад офсет индекс хийх нь илүү үр дүнтэй байх болно.
Энэ нь санах ойн хувьд спрайт бүрт 16 байт хэмнэж, хурдны хувьд оройн дундуур 30 хувиар хурдан гарах болно. Энэ бол өгөгдөлд чиглэсэн дизайн юм. C#-ийн хувьд ч мөн адил.

Оновчлолын үндсэн чиглэлүүд:
1. Салбарын тоог цөөрүүлэх
2. Санах ойд байгаа өгөгдлийг ижил төрлөөр нь бүлэглэх (C# хэл дээр хэн ч бүтцийн массивыг цуцлаагүй байна)
3. Барилга байгууламжийн хэмжээг багасгах

19.inline функцууд:
+ хурдыг нэмэгдүүлнэ
- кодыг нэмэгдүүлдэг
- хөрвүүлэхдээ кодод хамаарлыг (*.h файл) нэмнэ. Энэ нь функц дэх кодыг өөрчлөх үед эмхэтгэх хугацаа болон эзлэхүүнийг нэмэгдүүлдэг

Өгөгдөл:
1. хөрвүүлэгч функцийг дотор нь оруулахгүй байж магадгүй (_forceinlie хүртэл - доторлогооны баталгаа байхгүй)
2. Хурдны оновчлолыг идэвхжүүлсэн үед VS хөрвүүлэгч нь шугаман гэж зарлагдаагүй байсан ч дурын функцийг өөрийн үзэмжээр оруулдаг.

Дүгнэлт: та inline функцийг ашиглахаас зайлсхийх хэрэгтэй. Одоо энэ шаардлагагүй. Үл хамаарах зүйл нь зөвхөн доод түвшний код (математик функц гэх мэт) эсвэл бүрэн код оновчлолгүйгээр хөрвүүлэгч ашиглан програм бичих тохиолдолд л (жишээ нь, PlayStation3 хөрвүүлэгчийн хувьд inline ашиглах нь хамааралтай хэвээр) байж болно.

20. Бүтэц дэх хувьсагчдын дарааллыг өөрчилсний үр дүнг авч үзье.
struct s1 ( short int a; double b; int d; ) sizeof(s1[ 10 ]) == 24 * 10 struct s2 ( double b; int d; short int a; ) sizeof(s1[ 10 ]) == 16 * 10 давхар, 8 нь үргэлж зэрэгцдэг

21. Хөвөгч утгын нэр томъёоны газруудыг өөрчлөн байршуулснаар нийлбэр өөрчлөгдөнө.
1e+8f + 1.23456 - 1e+8f == 0 харин 1e+8f - 1e+8f + 1.23456 == 1.23456

22. Хоёртын хайлтыг цөөн тооны зүйлд ашиглаж болохгүй. Хэрэв элементүүдийн тоо 40-60-аас бага байвал (энэ тоо нь алгоритмын хэрэгжилтээс ялгаатай байж болох ч энэ дарааллаар) хоёртын хайлт нь шугаман хайлтаас удаан байх болно.

23.
Энэ нь боломжтой: bool b; int a = b? x: y; Гэхдээ илүү хурдан: int b; (0 - худал, -1 - үнэн) int a = (x & b) | (y & ~b);

24.
int a, b; 1. int x = (a >= b ? 1: 0); 2. int x = (a >= b ? -1: 0); Орлуулж болно: 1. int x = (b - a) >> 31; 2. int x = (b - a) & 0x80000000;

25.
i32 iIndex; Нөхцөл байдал: хэрэв (iIndex< 0 && iIndex >= iSize) Үүгээр орлуулж болно: if((u32)iIndex >= iSize) Нөхцөл: if(i >= min && i<= max) Можно заменить таким: if((u32)(i-min) <= (u32)max - min)

26. Свичийг хэрхэн статик const массив болгон хувиргаж, индексээр хандаж болох жишээг дээр дурдсан. Энэ нь жишээ нь rtti (ажлын цагийн төрлийг тодорхойлох)-д хамаарна. Хэрэв функцийн заагч шилжүүлэгчийг ийм байдлаар тодорхойлсон бол түүнийг хүссэн функцэд тогтмол нэвтрэх эрхээр солих нь маш ашигтай байж болох юм. Төрийн машин бол мөн адил. Шилжүүлэгчид шинэ элемент нэмэхийн оронд дээрх массив дээр нэмж болно. Гэхдээ 16-р зүйлийг санаарай.

int func(int index) ( switch(индекс) ( тохиолдол 0: буцах f_Func1(); тохиолдол 3: буцах f_Func2(); тохиолдол 4: буцах f_Func2(); .. тохиолдол .. буцах f_FuncN(): ) буцаах 0; ) дараахаар солино: int func(int index) ( статик funcPtr массив = ( &f_Func1, NULL, &f_Func2, ... &f_FuncN ) буцах массив[ индекс ](); )

Нэмж хэлэхэд

Илүү үр дүнтэй код бичих талаар нэмэлт зөвлөгөө авахыг хүсвэл дараах нийтлэлүүдийг үзнэ үү.

Гунигтай байдлын талаар бага зэрэг: бидний бүх амьдрал тоормостой тэмцэл юм. Тэгээд үүрд ингээд байж болохгүй. Ажлын байрнаас эхлээд бүх зүйлийг оновчтой болгох шаардлагатай. Энэ нийтлэлд би Delphi програмчлалын хэл дээрх код оновчлолын жишээг өгсөн, гэхдээ надад итгээрэй, хэрэв та энэ талаар бодож байвал эдгээр зөвлөмжүүд танд бодит амьдрал дээр хэрэг болно.

1. Бараг бүх зүйлийг оновчтой болгох боломжтой. Бүх зүйл хурдан ажилладаг мэт санагдаж байсан ч та үүнийг илүү хурдан хийж чадна. Аливаа асуудлыг хэд хэдэн аргаар шийдэж болно гэдгийг санах нь зүйтэй бөгөөд таны даалгавар бол тэдгээрийн хамгийн оновчтойг сонгох явдал юм.

2. Оновчлол нь үргэлж програмын кодын сул талуудаас эхлэх ёстой. Ихэвчлэн ийм хурдан ажилладаг зүйлийг оновчтой болгох шаардлагагүй байдаг. Мөн ийм оновчлолын үр нөлөө хамгийн бага байх болно.

3. Оновчлохдоо та бүх үйлдлүүдийг, оператор бүрийг юуг ч алдалгүйгээр шинжлэх хэрэгтэй. Ихэвчлэн оновчлол нь кодын байнга давтагддаг үйлдлүүд, циклүүд байдаг газруудаас эхэлдэг. Давталтын дотор байгаа зүйл n олон удаа давтагдах тул давталт дахь код бага байх тусам процессор үүнийг хурдан тооцоолох болно. Хэрэв мөчлөг хэт том болвол хэд хэдэн жижиг хэсгүүдэд задарч болно. Энэ тохиолдолд манай программын хэмжээ нэмэгдэх боловч хурд нь нэмэгдэх болно.

4. Хөвөгч цэгийн тооцоог бага ашиглахыг хичээ. Бүхэл тоонуудтай аливаа үйлдлийг илүү хурдан гүйцэтгэдэг. Үржүүлэх, хуваах үйлдлүүд ч мөн адил удаан үргэлжлэх болно. Үржүүлэхийн оронд нэмэхийг ашиглах нь зүйтэй бөгөөд хуваахыг ээлжээр сольж болно. Шифт нь үржүүлэх, хуваахаас хамаагүй хурдан юм. Учир нь бүх тоо хоёртын системд хадгалагддаг. Хэрэв та тоог аравтын бутархайгаас хоёртын систем рүү хөрвүүлж, тоог нэг байрлалаар баруун тийш шилжүүлбэл энэ үйлдэл нь 2-т хуваагдахтай төстэй болохыг анзаарах болно. Зүүн тийш шилжих үед тоо 2-т хуваагдана. Хэдийгээр эдгээр үйлдлүүд нь үүнтэй адил, ээлж хэд дахин хурдан ажилладаг.

5. Процедурыг үүсгэхдээ олон тооны оролтын параметрүүдийг ачаалж болохгүй. Процедурыг дуудах бүрт түүний параметрүүдийг санах ойн тусгай хэсэг болох стек рүү шилжүүлж, гарсны дараа тэндээс устгадаг. Мөн болгоомжтой, параметрүүдийг өөрсдөө хийх шаардлагатай. Их хэмжээний өгөгдлийг агуулсан хувьсагчдыг цэвэр хэлбэрээр процедурт илгээх шаардлагагүй. Өгөгдөл хадгалагдаж буй санах ойн үүрний хаягийг дамжуулж, процедурын дотор энэ хаягтай аль хэдийн ажиллах нь дээр.

6. Дэлгэц рүү гарах гэх мэт програмын хамгийн чухал мөчүүдэд та Ассемблер хэлийг ашиглаж болно. Delphi-ийн суулгасан ассемблер хүртэл эх хэлний функцээс хамаагүй хурдан байдаг. Ассемблерийн кодыг тусдаа модуль болгон гаргаж, эмхэтгэж, өөрийн програмтай холбож болно.

7. Шаардлагагүй шалгалт байхгүй. Хэрэв танд ямар нэгэн стандарт бус нөхцөл байдал байхгүй бол энэ нь хэрэглэгчийн хувьд ч үүсэхгүй гэж битгий бодоорой. Оролт шаардлагатай болтол хүлээлгүйгээр хэрэглэгчийн оруулсан зүйлийг үргэлж баталгаажуул.

8. Хэрэв та нэлээн том, нүсэр програм бичиж байгаа бол түүндээ сэтгэгдэл бичээрэй. Хөрвүүлэгч тэднийг үл тоомсорлодог. Хэрэв та гэнэт програмынхаа эх кодыг зарахыг хүсч байвал сэтгэгдэл нь үнийг нь өсгөж, өөрөө удирдахад хялбар байх болно.

9. Сайн үр дүнд хүрэхийн тулд та IDE, хөгжүүлэгчийн нэгдсэн орчин, программчилж буй хэлээ, манай тохиолдолд Delphi-г мэддэг байх ёстой. Ихэвчлэн IDE сонголтууд нь янз бүрийн төрлийн хөрвүүлэгчийг сонгох боломжийг олгодог бөгөөд анхдагч нь хамгийн энгийн, хурдан эмхэтгэх боловч оновчтой бус код үүсгэдэг. Тиймээс үргэлж хөрвүүлэгчийн хамгийн оновчтой төрлийг байрлуул.

10. Программуудыг стандарт интерфейстэй болгохыг хичээ. За, гурвалжин товчлуур, стандарт бус цэс болон бусад график хонх, шүгэл хийх шаардлагагүй. Энэ бүхэн нь програмыг ихээхэн удаашруулж, компьютерийн нөөцийг их хэмжээгээр зарцуулж, хөгжүүлэлтийн нэмэлт цагийг шаарддаг. Жишээлбэл, жинхэнэ UNIX нь ерөнхийдөө ердийн бүрхүүл буюу команд оруулах мөр юм.

Бүх зүйл шиг. Хөтөлбөрөө бичихэд тань амжилт хүсье, эдгээр зөвлөмжийг дагаж мөрдвөл та амжилтанд хүрнэ.

Мөн үр ашгийг дээшлүүлэх. Оновчлолын зорилгод кодын хэмжээ, програмын ашигладаг RAM-ийн хэмжээг багасгах, програмыг хурдасгах, оролт гаралтын үйлдлүүдийн тоог багасгах зэрэг орно.

Оновчлолын аргад тавигддаг гол шаардлага бол оновчлогдсон програм нь оновчгүй програмтай ижил төрлийн оролтын өгөгдөлд ижил үр дүн, гаж нөлөө үзүүлэх ёстой. Гэсэн хэдий ч, оновчлолын ашиглалтаас олох ашиг нь програмын зан төлөвийг өөрчлөх үр дагавраас илүү чухал гэж үзвэл энэ шаардлага онцгой үүрэг гүйцэтгэхгүй байж магадгүй юм.

Оновчлолын төрлүүд

Кодын оновчлолыг гараар, программист болон автоматаар хийж болно. Сүүлчийн тохиолдолд оновчлогч нь тусдаа програм хангамжийн хэрэгсэл эсвэл хөрвүүлэгчид (оновчлох хөрвүүлэгч гэж нэрлэгддэг) суурилагдсан байж болно. Нэмж дурдахад орчин үеийн процессорууд кодын зааварчилгааг гүйцэтгэх дарааллыг оновчтой болгож чадна гэдгийг тэмдэглэх нь зүйтэй.

Дээд түвшний, доод түвшний оновчлол гэх мэт ойлголтууд байдаг. Өндөр түвшний оновчлолыг ихэвчлэн хийсвэр объектуудтай (функц, процедур, ангиуд гэх мэт) ажиллуулж, асуудлыг шийдвэрлэх ерөнхий загварыг төсөөлж, системийн дизайныг оновчтой болгож чаддаг програмист хийдэг. Эх кодын анхан шатны бүтцийн блокуудын түвшинд (гогцоо, салбар гэх мэт) оновчлолыг ихэвчлэн өндөр түвшин гэж нэрлэдэг; зарим нь тэдгээрийг тусдаа (“дунд”) түвшин гэж ялгадаг (Н. Вирт?). Доод түвшний оновчлол нь эх кодыг машины зааврын багц болгон хувиргах үе шатанд хийгддэг бөгөөд энэ үе шат нь ихэвчлэн автоматжуулалтад хамрагддаг. Гэсэн хэдий ч ассемблер хэлний програмистууд энэ тал дээр ямар ч машин сайн програмистыг гүйцэж чадахгүй гэж үздэг (харин муу програмист машиныг улам дордуулна гэдэгтэй бүгд санал нийлдэг).

Оновчлох талбайг сонгох

Кодыг гараар оновчтой болгоход өөр нэг асуудал гардаг: та зөвхөн хэрхэн оновчтой болгох талаар төдийгүй хаана хэрэглэхээ мэдэх хэрэгтэй. Ихэвчлэн янз бүрийн хүчин зүйлээс шалтгаалан (оролтын ажиллагаа удаашрал, хүний ​​​​оператор ба машины хурдны ялгаа гэх мэт) кодын ердөө 10% нь гүйцэтгэлийн хугацааны 90% -ийг авдаг (мэдээжийн хэрэг, мэдэгдэл нь арай илүү юм. таамаглалтай, мөн хуулийн хэлбэрээр эргэлзээтэй үндэслэлтэй Парето хэдий ч Э.Таненбаумд нэлээд үнэмшилтэй харагдаж байна). Оновчлолд нэмэлт цаг зарцуулах шаардлагатай тул програмыг бүхэлд нь оновчтой болгохын оронд эдгээр "чухал" 10% гүйцэтгэлийг оновчтой болгох нь дээр. Ийм кодыг бөглөрөл эсвэл бөглөрөл гэж нэрлэдэг бөгөөд үүнийг тодорхойлохын тулд програмын янз бүрийн хэсгүүдийн цагийг хэмжих боломжийг олгодог тусгай программуудыг ашигладаг.

Үнэн хэрэгтээ практик дээр оновчлолыг ихэвчлэн "эмх замбараагүй" програмчлалын үе шат ("", "бид үүнийг дараа нь ойлгох болно", "ямар ч байсан хийх болно" гэх мэт) дараа хийдэг тул энэ нь зөв холимог юм. оновчлол, дахин засварлах, засах: strlen(path.c_str()), логикийн нөхцөл (a.x != 0 && a.x != 0) гэх мэт "хөөрхөн" бүтцийг хялбаршуулах. Профайлагчид ийм оновчтой болгоход бараг тохиромжгүй байдаг. Гэсэн хэдий ч ийм газруудыг илрүүлэхийн тулд та програмуудыг ашиглаж болно - эх кодын гүн гүнзгий дүн шинжилгээнд үндэслэн семантик алдааг олох хэрэгсэл - эцэст нь хоёр дахь жишээнээс харахад үр ашиггүй код нь алдааны үр дүн байж болно (жишээ нь: Энэ жишээн дэх үсгийн алдаа - хамгийн их магадлалтай, a.x != 0 && a.y != 0). Сайн код нь ийм кодыг илрүүлж, анхааруулах мессежийг харуулах болно.

Оновчлолын хор хөнөөл, ашиг тус

Програмчлалын бараг бүх зүйлийг оновчтой авч үзэх ёстой бөгөөд оновчлол нь үл хамаарах зүйл биш юм. Туршлагагүй ассемблер програмист ихэвчлэн хөрвүүлэгчийн үүсгэсэн кодоос (Зубков) 3-5 дахин удаан код бичдэг гэж үздэг. Эрт, нэлээд доогуур түвшний (нэмэлт оператор эсвэл хувьсагчийн төлөөх тэмцэл гэх мэт) оновчлолын талаар сайн мэддэг хэллэг байдаг бөгөөд үүнийг Кнутын томъёолсон: "Эрт оновчлол бол бүх бэрхшээлийн үндэс юм."

Ихэнх хүмүүс оновчлогчийн хийсэн оновчлолын талаар гомдоллодоггүй бөгөөд заримдаа зарим оновчлолууд нь бараг стандарт бөгөөд заавал байх ёстой - жишээлбэл, функциональ хэл дээрх сүүлний рекурсын оновчлол (Сүүлийн рекурс нь тодорхой төрлийн рекурс бөгөөд үүнийг багасгаж болно. мөчлөгийн хэлбэр).

Гэсэн хэдий ч машины кодын түвшинд олон тооны нарийн төвөгтэй оновчлолууд нь эмхэтгэлийн үйл явцыг ихээхэн удаашруулж чадна гэдгийг ойлгох хэрэгтэй. Түүнээс гадна, тэдгээрийн ашиг нь системийн ерөнхий дизайныг (Wirth) оновчтой болгохтой харьцуулахад маш бага байж болно. Түүнчлэн орчин үеийн, синтаксик, семантикийн хувьд "хөгжилтэй" хэлүүд нь олон нарийн шинж чанартай байдаг тул тэдгээрийг үл тоомсорлодог програмистууд оновчлолын үр дагаварт гайхаж магадгүй гэдгийг мартаж болохгүй.

Жишээ нь, C++ хэл болон гэж нэрлэгддэг хэлийг авч үзье. Буцаах утгыг оновчлох, түүний мөн чанар нь хөрвүүлэгч нь функцээр буцаасан түр зуурын объектын хуулбарыг үүсгэхгүй байх явдал юм. Энэ тохиолдолд хөрвүүлэгч хуулбарыг "алгасан" тул энэ заль мэхийг мөн "Copy elision" гэж нэрлэдэг. Тиймээс дараах код:

#оруулна struct C ( C() () C(const C&) ( std::cout<< "A copy was made.\n"; } }; C f() { return C(); } int main() { std::cout << "Hello World!\n"; C obj = f(); }

хэд хэдэн гаралтын сонголттой байж болно:

сайн уу ертөнц! Хуулбар хийсэн. Хуулбар хийсэн. сайн уу ертөнц! Хуулбар хийсэн. сайн уу ертөнц!

Хачирхалтай нь, уг гурван сонголт бүгд хууль ёсны бөгөөд хэлний стандарт нь тухайн бүтээгчид гаж нөлөө үзүүлсэн ч хуулбар үүсгэгчийн дуудлагыг орхигдуулахыг зөвшөөрдөг (§12.8 Ангийн объектуудыг хуулах, 15-р зүйл).

Үр дүн

Тиймээс, боломжтой бол тусгай програм хангамжийн хэрэгслийг ашиглан кодыг оновчтой болгохоо бүү мартаарай, гэхдээ үүнийг болгоомжтой, болгоомжтой хийх хэрэгтэй бөгөөд заримдаа хөрвүүлэгчээс гэнэтийн зүйлд бэлдэх хэрэгтэй.

PVS Studio

Ном зүйн жагсаалт

  • Э.Таненбаум. Компьютерийн архитектур.
  • Wirth N. Барилгын эмхэтгэгчид.
  • Knut D. Програмчлалын урлаг, 1-р боть. Үндсэн алгоритмууд.
  • Зубков С.В. DOS, Windows болон UNIX-д зориулсан ассемблер.
  • Википедиа. кодын оновчлол.
  • Википедиа.

Сайтын анхны хөгжүүлэлтийн үеэр эзэд нь түүний гадаад ойлголт, хурдан эхлүүлэхэд хамгийн их анхаарал хандуулдаг. Гаргаснаас хойш тэр даруй эсвэл хэдхэн сарын дараа хэрхэн илүү олон үйлчлүүлэгчдийг татах вэ гэсэн асуулт гарч ирдэг. Хэсэг хугацааны дараа зохион бүтээгч, программист сайтын дотоод оновчлол дээр ажиллахаар ирсэн бөгөөд энэ нь бичсэн кодын хэсгийг дахин бичих шаардлагатай болж байна. Тиймээс энэ нийтлэлд бид сайтын анхны хөгжүүлэлтийн явцад html, css, js кодыг оновчтой болгох талаар ярих болно, ингэснээр үйлчлүүлэгч мөнгө хэмнэж, хөгжүүлэгчдийн сэтгэлийг хөдөлгөх болно.

js ба css оновчлол

Css болон js-ээс эхэлцгээе. Css ба js оновчлол юунд зориулагдсан вэ?

Ачаалахад 3 секундээс илүү хугацаа шаардагдах тохиолдолд хэрэглэгчдийн 50 орчим хувь нь сайтыг орхидог бөгөөд нэмэлт секунд тутамд сайтын хөрвүүлэлт 7% -иар буурдаг. Мөн вэбсайтыг ачаалах хурд нь зэрэглэл тогтоох хүчин зүйлүүдийн нэг юм.

Хамгийн эхний хийх зүйл бол Google-ийн зөвлөмжийг дагаж мөрдөх явдал юм. Css болон js кодыг сайтын html кодонд агуулаагүй, тусдаа файлд байрлуулна. Үл хамаарах зүйл бол 1-2 утгатай жижиг шугаман загварууд юм. Оруулсан файлуудын тоог аль болох багасгаж, тус бүр нэг css болон js файл үлдээх нь зүйтэй. js файлуудын холболтыг хуудасны төгсгөлд шилжүүлэх ёстой (хуудсыг харуулахын өмнө хөтөч үүнийг задлан шинжилж, хэрэв гадаад скрипт илрүүлбэл түүнийг ачаалах ёстой бөгөөд энэ нь үйлдлүүдийг удаашруулдаг нэмэлт мөчлөг юм. хуудасны дэлгэц.

Мөн js, css файл, зургийг ачаалах ажлыг хурдасгахын тулд GZIP форматаар кэш, шахалтыг ашиглах нь зүйтэй.

Вэб сайтын SEO зохион байгуулалт: html кодын оновчлол эсвэл үүнийг дараа дахин хийх шаардлагагүй болгохын тулд хэрхэн хийх вэ

Ирээдүйд html кодын зөв оновчтой болгохын тулд бүх хаягууд болон тэдгээр нь SEO-д хэрхэн нөлөөлж байгааг харцгаая.

Блоклох :

- хөтчийн таб болон хайлтын системд байрлуулсан хуудасны нэрийг заана. Сайтын зэрэглэлд нөлөөлөх хамгийн чухал шошго.</p> <p><description>- гарчиг дор хайлтын үр дүнд гарч ирэх хуудасны тайлбарыг тохируулах боломжийг танд олгоно. Энэ нь зэрэглэлд хамаагүй бага нөлөө үзүүлдэг боловч хуудасны CTR-ийг (товшиж, сэтгэгдэлийн харьцаа) нэмэгдүүлэхэд тусалдаг. Хэрэв мета тайлбарын шошгыг бөглөсөн бол хайлтын системүүд контентоос тайлбарыг авах боломжтой тул үр дүн нь яг юу бичсэнийг харуулах баталгаа болохгүй. Гэсэн хэдий ч шошго үүсгэх тохиргоог хийх нь дээр бөгөөд PS текстийн аль хэсгийг тайлбарлах талаар бодохгүй байх нь дээр.</p> <p><keywords>- холбогдох хуудсыг асууж буй хайлтын системд заадаг. Энэхүү шошгыг нэвтрүүлсний дараа хуудасны зэрэглэлд ихээхэн нөлөөлсөн. Оновчлогчид онлайн дэлгүүрийн аль ч бүтээгдэхүүнтэй хуудсыг хялбархан сурталчлах боломжтой, жишээлбэл, "түүхийн хураангуйг татаж авах" хүсэлтээр эсвэл сайтад зочдыг авчирсан бусад сэдвээр, гэхдээ үйлчлүүлэгчид биш. Одоо энэ шошгоны сурталчилгаанд үзүүлэх нөлөө нь тодорхойгүй байгаа бөгөөд олон хүмүүс хуудсыг гэмтээхгүйн тулд үүнийг үл тоомсорлодог.</p> <p><meta name="robots" content="index/noindex, follow/nofollow">(үнгийн аль нэгийг нь авна, индекс эсвэл noindex, дагаж эсвэл nofollow) - хайлтын системээр хуудсыг индексжүүлэхийг хориглох (noindex) болон хуудасны гарч буй холбоосыг индексжүүлэхийг хориглох (nofollow). Хуудас болон холбоосын индексжүүлэлтийг анхдагчаар зөвшөөрдөг тул индекс ба дагах утгуудыг индексжүүлээгүй утгуудтай хамт ашигладаг. Хэсэг хугацааны дараа хайлтын системээс тэг урсгалыг харахгүйн тулд энэ шошгыг болгоомжтой ашиглаарай.</p> <p><link rel="canonical" href="..." />- зэрэглэлийг сайжруулахын тулд агуулгын хэд хэдэн ижил хуудсуудыг өөр өөр URL-тай холбох боломжийг танд олгоно. Ихэнх тохиолдолд энэ нь ижил агуулга агуулсан динамик хуудсуудад ашиглагддаг, жишээлбэл, бүтээгдэхүүний каталог дахь хуудсуудыг эрэмбэлэх эсвэл блогтой ажиллахад нэг нийтлэл нь өөр өөр хэсгүүдэд байж болох бөгөөд өөр өөр URL-уудтай байдаг.</p> <p><link rel="prev" href="..." />Тэгээд <link rel="next" href="..."/>- хаягууд нь материалыг хэд хэдэн хэсэгт хувааж, өөр URL дээр байрлуулсан бол хуудасны хуудасны хайлтын системийн өмнөх болон дараагийн хуудсыг зааж өгөх боломжийг олгодог.</p> <h3>Блоклох <body> :</h3> <p><h1> - <h6>- хуудасны гарчиг. Tag <h1>зэрэг нэг удаа хэрэглэх ёстой <title>энэ нь хуудасны үндсэн агуулгыг зааж байгаа боловч SERP дахь зэрэглэлд бага нөлөө үзүүлдэг. Дүрмээр бол шошгон дээрх онлайн дэлгүүрүүдэд зориулсан <h1>Эдгээр ангилал, бүтээгдэхүүний нэрийг категори, бүтээгдэхүүний хуудсан дээр, мэдээллийн хуудсанд - уншигчдын сонирхлыг татах нэр, боломжтой бол түлхүүр үгсийг зааж өгсөн болно.</p> <p>шошго <h1> - <h6>логик бүтэцтэй байх ёстой. толгой <h1>толгойг агуулсан <h2>, гарчигтай <h3>гэх мэт. Тэдгээрийг зөвхөн хуудасны текстийн агуулгад ашиглахыг зөвлөж байна (жишээлбэл, хуудасны үндсэн агуулгыг эвдэх, гэхдээ сайтын бүх хуудсан дээр харагдах блокуудад ашиглахгүй). Үүнийг анхаарч үзвэл шошго <h1>зэрэглэл дэх үгсийн үнэ цэнийг нэмэгдүүлэх, сайт дээрх бүх текстийг түүнд хавсаргаж, унших боломжтой хэв маягийн тусламжтайгаар засахад тусалдаг бөгөөд энэ нь ямар ч давуу тал өгөхгүй, харин зөвхөн ийм хуудсанд хор хөнөөл учруулах болно.</p> <p><strong>, <b>, <em>- хуудас, нийтлэл, мэдээ гэх мэтийг тайлбарлахдаа тодорхой хэллэг, үгсэд анхаарлаа төвлөрүүлэхэд зориулагдсан. (үнэлэхдээ эдгээр үгсийн ач холбогдлыг нэмэгдүүлэх). Та тэдгээрийг жишээ нь бүх бүтээгдэхүүн дээр давтагддаг хуудасны элементүүдийн зохион байгуулалтад ашиглах ёсгүй. Үүний тулд css ашиглах нь дээр. Хэдийгээр сайтын бүх хуудсан дээр давтагдсан үг, хэллэг нь нөлөө үзүүлдэг эсэх нь тодорхойгүй байгаа ч, жишээлбэл, шошго дотор байдаг. <strong>, гэхдээ шошгыг зориулалтын дагуу ашиглах нь дээр. PS үүнийг үнэлнэ гэж бодож байна.</p> <p><table>- мөн үндсэндээ хуудасны текстийн агуулгад байрлуулах зориулалттай. Энэ нь текстийг уншихад илүү сонирхолтой болгох боломжийг олгодог бөгөөд энэ нь хайлтын системээс (жагсаалт, зураг, видео бичлэгүүд ижил нөлөө үзүүлдэг) бүх хуудасны найдвартай байдлыг нэмэгдүүлдэг.</p> <p><ul>, <li>, <ol>, <dl>, <dd>, <dt>- сайтын цэсийг бий болгоход ашигладаг жагсаалтууд болон хуудасны үндсэн хэсэгт текст мэдээллийг бүтэцжүүлэхэд зориулагдсан болно.</p> <p><img>- хуудсан дээрх зургууд. Зургийн тайлбарыг alt=”...” болон гарчиг=”...” шинж чанаруудад байрлуулсан байх ёстой бөгөөд энэ нь зураг хайхад зэрэглэл тогтооход тусална. Мөн зургийн файлын нэр тайлбартай таарч байвал хайлтын үр дүнд зургийн байрлалд нөлөөлнө.</p> <p><noindex>- Yandex-д индексжүүлэх шаардлагагүй баримт бичгийн агуулгыг, жишээлбэл, үйлчилгээний мэдээллийг заана. Үүнийг маш болгоомжтой, ховор тохиолдолд ашиглах ёстой.</p> <p><div>- сайтын байршлын жинхэнэ шошго нь SEO-д нөлөөлөхгүй.</p> <p>Текстийг боох шошго, гэхдээ блокуудын байршлыг өөрчлөхөд зориулагдаагүй. Гэхдээ энэ нь оновчтой болгохын тулд биш харин бүдүүвчийн хүчин төгөлдөр байдлын төлөө юм. Энэ нь сайтын оновчлолд нөлөөлөхгүй.</p> <p><p>Сайтын үндсэн агуулгын текстийн догол мөрийг (жишээ нь, нийтлэл эсвэл бүтээгдэхүүний тодорхойлолт, онлайн дэлгүүрийн ангилал) зааж өгдөг. Мөн нэг хуудасны үндсэн агуулгад голчлон хэрэглэх нь зүйтэй.</p> <p>SEO дээр ямар ч нөлөө үзүүлэхгүй мөрийн элемент. Ихэнх тохиолдолд үндсэн хуудасны бус агуулгад css-тэй хамт онцлох болон гарчгийн шошгыг орлуулахад хэрэгтэй.</p> <p><header>- сайтын толгой хэсэг.</p> <p><footer>сайтын хөл хэсэг.</p> <p><a>- Энд бидэнд тусдаа нийтлэл хэрэгтэй байна. Тэгээд ганцаараа биш.</p> <p>Магадгүй би зарим шошгыг алдсан байх ... гэхдээ энэ нь тийм ч чухал биш гэсэн үг юм. Мөн шинэ html5 хаягуудын заримыг тооцоогүй, жишээ нь <article> , <aside> , <nav> , <section> .</p> <p>Хэрэв та html хаягуудыг түлхүүр үгсийн хамааралд нөлөөлөх байдлаар нь цэгцэлж байвал энэ нь хаа нэгтээ гарч ирнэ: гарчиг, h1-h6, хүчтэй, тайлбар, b, em, p, түлхүүр үгс, ul->li & ol->li.</p> <p>Одоо илүү сайн танилцуулахын тулд хуудасны зөв оновчтой зохион байгуулалтыг бий болгохыг хичээцгээе.</p><p> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Хуудасны гарчиг

  • Ангилал 1
  • 2-р ангилал
    • Ангилал 2.1
    • Ангилал 2.2
  • Ангилал 3

Хуудасны гарчиг

Шошго бүхий үндсэн агуулга

-

, , , ,
, .

Нэмэлт мэдээлэл бүхий хажуугийн блок.
...


Сайтын SEO зохион байгуулалтыг хийхдээ өөр юуг анхаарах хэрэгтэй вэ

  • Олон тооны баталгаажуулалтын алдаа нь хуудсанд муу нөлөө үзүүлж болно. Хуудас дээр ашиглагдаагүй хоосон таг болон css, js файлуудыг ашиглахыг зөвлөдөггүй. Код нь хөнгөн байх тусам хайлтын системд дүн шинжилгээ хийхэд хялбар байдаг.
  • Хайлтын системд тийм ч таатай биш флаш болон фрейм ашиглах ёсгүй. Мөн хайлтын системүүд зураг ашиглан зурсан текстийг танихгүй.
  • Хөтөч хоорондын сайт нь хэрэглэгчдийн зан төлөвт нөлөөлж, шаардлагатай мэдээллийг хүлээн авалгүй, худалдан авалт хийлгүйгээр сайтаас гарахад хүргэдэг. Үүний үр дүнд сайтыг бүхэлд нь оновчтой болгоход нөлөөлдөг зан үйлийн хүчин зүйлүүд улам дорддог.
  • Сайтын гар утасны хувилбар байгаа эсэх эсвэл түүний дасан зохицох чадвар зэрэг нь эрэмбийн хүчин зүйл болсон бөгөөд хөтчүүд хоорондын нийцтэй байдлын нэгэн адил сайтын гаралтын хурдыг бууруулж, хөдөлгөөнт төхөөрөмж дээр сайтын хөрвүүлэлтийг нэмэгдүүлэх боломжийг олгодог. Google 2015 онд гар утасны хувилбарыг (гар утсанд ээлтэй), Yandex 2016 онд "Владивосток" гэж нэрлэж, эрэмбэлэх алгоритмыг харгалзан үзэж эхэлсэн.
  • Хуудасны үндсэн агуулгыг html кодонд эхэнд нь ойртуулах ёстой бөгөөд ингэснээр хайлтын системийн үүднээс илүү хамааралтай байх болно.
  • Агуулгыг дэлгэцээр нууж болохгүй:none .
  • Хэрэв шошго ашиглах нь түлхүүр үгийн ач холбогдлыг нэмэгдүүлэх боломжтой бол, жишээ нь зарим шошго давхцвал сөрөг нөлөө үзүүлж болно.
    1. h1-h6 & хүчтэй, b, em
    2. h1-h6 & a href=…
    3. хүчтэй, b, em & a href=…

Дүгнэлт

Хайлтын системийн хуудсуудыг харахад сайтын зохион байгуулалттай холбоотой хэд хэдэн алдаа, түүний дотор баталгаажуулалтын алдааг харж болно. Гэхдээ энд тэд өөрсөддөө огт өөр зорилго тавьсан гэдгийг ойлгох хэрэгтэй. Хөдөлгөөний гол эх үүсвэрүүдийн нэг нь хайлтын системүүд болох сайтуудад SEO оновчтой зохион байгуулалт шаардлагатай бөгөөд сайт руу хичнээн сайхан линкүүд холбогдсон ч кодыг оновчтой болгохгүйгээр эхний байр суурийг мөрөөдөж чадахгүй.

Кодын оновчлолОновчлолын хөрвүүлэгч эсвэл орчуулагчийн гүйцэтгэл, нягтрал зэрэг шинж чанарыг сайжруулахын тулд функцийг өөрчлөхгүйгээр программуудын өөрчлөлт юм.

Энэ тодорхойлолтын сүүлийн гурван үг нь маш чухал юм: оновчлол нь програмын шинж чанарыг хичнээн их сайжруулж байгаагаас үл хамааран ямар ч нөхцөлд програмын анхны утгыг хадгалах ёстой. Тийм ч учраас жишээлбэл, GCC-д янз бүрийн түвшний оновчлол байдаг
Цаашид явцгаая: оновчлолууд байдаг машин бие даасан (өндөр түвшин)Тэгээд машинаас хамааралтай (доод түвшин). Ангиллын утга нь нэрнээс тодорхой харагдаж байна, машинаас хамааралтай оновчлолд тодорхой архитектурын онцлогийг ашигладаг, өндөр түвшний оновчлолд оновчлол нь кодын бүтцийн түвшинд явагддаг.

Оновчлолыг хэрэглээний хамрах хүрээнээс хамааран локал (оператор, операторуудын дараалал, үндсэн блок), процедур доторх, процедур хоорондын, модуль доторх болон глобал (програмыг бүхэлд нь оновчтой болгох, "угсралтын явцад оновчтой болгох") гэж ангилж болно. , "Холбоос цагийг оновчтой болгох").

Логик алдааг тодорхойлохын тулд модулийг дибаг хийх

Дибаг хийх PS нь программуудыг гүйцэтгэх процессуудыг ашиглан PS-ийн алдааг илрүүлэх, засахад чиглэсэн үйл ажиллагаа юм. Туршилт хийх PS гэдэг нь програмын үр дүн нь урьдчилан мэдэгдэж байгаа эсвэл эдгээр програмын ажиллах дүрмийг мэддэг тодорхой өгөгдлийн багц дээр програмаа гүйцэтгэх үйл явц юм. Заасан өгөгдлийн багцыг дуудна тестэсвэл зүгээр л тест. Тиймээс дибаг хийх нь гурван процессын давтагдах байдлаар илэрхийлэгдэж болно: туршилт, үүний үр дүнд PS-д алдаа байгаа эсэхийг тогтоох, PS-ийн програм, баримт бичигт алдаа гарсан газрыг хайх, илэрсэн алдааг арилгахын тулд програм, баримт бичгийг засварлах. Өөрөөр хэлбэл:

Дибаг хийх = Туршилт + Алдаа хайх + Засварлах.

Гадаадын уран зохиолд дибаг хийх нь ихэвчлэн туршилтын явцад тогтоогдсон алдааг олж засварлах үйл явц (туршилтгүйгээр) гэж ойлгогддог. Заримдаа туршилт, дибаг хийх нь ижил утгатай гэж үздэг. Манай улсын хувьд дибаг хийх гэдэг ойлголтод ихэвчлэн тест ордог тул тогтсон уламжлалаа баримтална. Гэсэн хэдий ч энэхүү лекцэд эдгээр үйл явцыг хамтдаа авч үзэх нь энэ зөрүүг тийм ч чухал биш болгож байна. Гэсэн хэдий ч туршилтыг PS баталгаажуулалтын үйл явцын нэг хэсэг болгон ашигладаг гэдгийг тэмдэглэх нь зүйтэй.



Програм хангамжийн дибаг хийх зарчим, төрлүүд

PS дибаг хийх амжилт нь туршилтын оновчтой зохион байгуулалтаар тодорхойлогддог. PS-ийг дибаг хийхдээ голчлон эдгээр алдааг олж, арилгадаг бөгөөд туршилтын явцад PS-д байгаа эсэхийг тогтоодог. Өмнө дурьдсанчлан туршилт нь PS-ийн зөвийг баталж чадахгүй, хамгийн сайндаа энэ нь алдаа байгааг харуулж чадна. Өөрөөр хэлбэл, програм хангамжийг практикт хэрэгжих боломжтой багц тестээр турших замаар програм хангамжид байгаа алдаа бүрийг тогтоох боломжтой гэдгийг батлах боломжгүй юм. Тиймээс хоёр асуудал гарч ирдэг. Эхний ажил бол ийм багц тестийг бэлдэж, аль болох олон алдааг илрүүлэхийн тулд PS-ийг ашиглах явдал юм. Гэсэн хэдий ч туршилтын үйл явц (мөн ерөнхийдөө дибаг хийх) удаан үргэлжлэх тусам програм хангамжийн өртөг өндөр болно. Тиймээс хоёр дахь даалгавар: PS (эсвэл түүний бие даасан бүрэлдэхүүн хэсгүүд) дибаг хийж дуусах мөчийг тодорхойлох. Дибаг хийх төгсгөлийн боломжийн шинж тэмдэг бол PS програмыг хэрэгжүүлэх явцад үүсдэг олон янзын нөхцөл байдлын PS-ээр дамжсан туршилтууд (жишээ нь, PS-ийг ашигладаг туршилтууд) бүрэн хамрагдах явдал юм. Туршилтын сүүлийн сегмент дэх PS-ийн алдааны харьцангуй ховор илрэл. Сүүлийнх нь чанарын тодорхойлолтод заасан PS-ийн найдвартай байдлын шаардагдах түвшний дагуу тодорхойлогддог.

Туршилтын багцыг оновчтой болгохын тулд, i.e. Өгөгдсөн тооны хувьд (эсвэл туршилтанд хуваарилсан тодорхой хугацааны интервалд) PS-ийн олон тооны алдааг илрүүлэх боломжийг олгодог ийм багц тестийг бэлтгэхийн тулд юуны түрүүнд төлөвлөх шаардлагатай. Энэ нь урьдчилан тогтоосон, хоёрдугаарт, оновчтой стратеги төлөвлөлт (дизайн) тест ашиглах. Туршилтын дизайныг PS-ийн гадаад тайлбарын үе шат дууссаны дараа шууд эхлүүлж болно. Туршилтын дизайны стратегийг боловсруулах янз бүрийн арга барилууд байдаг бөгөөд эдгээрийг дараах хоёр туйлын аргын хооронд нөхцөлт графикаар байрлуулж болно. Зүүн туйлын хандлага бол туршилтыг зөвхөн PS-ийн үзүүлэлтүүдийг (гадаад тайлбар, архитектурын тодорхойлолт, модулийн тодорхойлолт) судлах үндсэн дээр боловсруулдаг явдал юм. Модулиудын бүтцийг ямар ч байдлаар тооцдоггүй, i.e. тэднийг хар хайрцаг гэж үздэг. Үнэн хэрэгтээ энэ арга нь бүх оролтын өгөгдлийн багцыг бүрэн тоолохыг шаарддаг, эс тэгвээс тестийг алгассан тохиолдолд PS програмын зарим хэсэг ажиллахгүй байж магадгүй бөгөөд энэ нь тэдгээрт агуулагдах алдаа гарч ирэхгүй гэсэн үг юм. Гэсэн хэдий ч PS-ийг оролтын өгөгдлийн багцаар турших нь бараг боломжгүй юм. Зөв туйлын арга бол PS програм бүрийг хэрэгжүүлэх бүх арга замыг шалгахын тулд програмын текстийг судалсны үндсэн дээр тестүүдийг зохион бүтээсэн явдал юм. Хэрэв бид програмуудад олон тооны давталттай циклүүд байгааг харгалзан үзвэл PS програмуудыг гүйцэтгэх маш олон янзын арга байж болох тул тэдгээрийг турших нь бараг боломжгүй болно.

Нэгжийн туршилт

Нарийн төвөгтэй програм хангамжийн систем бүр нь тусдаа хэсгүүдээс бүрддэг - системийн нэг хэсэг болгон тодорхой функцийг гүйцэтгэдэг модулиуд. Системийн зөв ажиллагааг бүхэлд нь шалгахын тулд эхлээд системийн модуль бүрийг тусад нь турших шаардлагатай. Асуудал гарсан тохиолдолд энэ нь асуудлыг үүсгэсэн модулиудыг таньж, тэдгээрийн холбогдох согогийг арилгахад хялбар болгоно. Модулуудыг тус тусад нь туршиж үзэхийг нэгжийн туршилт гэж нэрлэдэг ( нэгжийн туршилт).

Туршилтанд хамрагдаж буй модуль бүрийн хувьд драйвер, бүдүүвчийг багтаасан туршилтын орчинг боловсруулж, тодорхой туршилтын тохиолдлуудыг тодорхойлсон туршилтын шаардлага, туршилтын төлөвлөгөөг бэлтгэдэг.

Нэгжийн туршилтын гол зорилго нь системийн тусдаа модуль бүрийг системд нэгтгэхээс өмнө шаардлагад нийцэж байгаа эсэхийг шалгах явдал юм.

Үүний зэрэгцээ нэгжийн туршилтын явцад дөрвөн үндсэн ажлыг шийддэг.

1. Үл тохирол олох, баримтжуулах- Энэ бол туршилтын орчин, тестийн тохиолдлуудыг боловсруулахаас гадна туршилтыг гүйцэтгэх, гүйцэтгэлийн үр дүнг бүртгэх, асуудлыг тайлагнах зэргийг багтаасан сонгодог туршилтын даалгавар юм.

2. Доод түвшний системийн архитектур, модуль хоорондын харилцаа холбоог хөгжүүлэх, шинэчлэхэд дэмжлэг үзүүлэх- Энэ даалгавар нь XP гэх мэт "хөнгөн" арга зүйд илүү онцлог бөгөөд програм хангамжийн модульд тавигдах шаардлагын гол эх үүсвэр нь модулийн өмнө бичсэн тест юм. Гэсэн хэдий ч, туршилтын сонгодог схемтэй байсан ч гэсэн нэгжийн туршилтууд нь системийн дизайн, модультай ажиллах логикгүй эсвэл ойлгомжгүй механизмыг илрүүлж чадна.

3. Модуль дахин боловсруулах дэмжлэг- Энэ даалгавар нь системийг өөрчлөх үйл явцыг дэмжихтэй холбоотой. Ихэнхдээ хөгжүүлэлтийн явцад модулиуд эсвэл тэдгээрийн бүлгүүдийг дахин засварлах шаардлагатай байдаг - засвар үйлчилгээ, хурд, найдвартай байдлыг нэмэгдүүлэхийн тулд програмын кодын оновчлол эсвэл бүрэн дахин дизайн хийх. Гэсэн хэдий ч нэгжийн тест нь програмын кодын шинэ хувилбар нь хуучин кодтой яг адилхан ажиллаж байгаа эсэхийг шалгах хүчирхэг хэрэгсэл юм.

4. Алдааг олж засварлах, дибаг хийхийг дэмжих- Энэ даалгавар нь хөгжүүлэгчид шалгагчдаас асуудлын тайлан хэлбэрээр хүлээн авдаг санал хүсэлттэй холбоотой юм. Нэгжийн туршилтын үе шатанд эмхэтгэсэн асуудлын нарийвчилсан тайлан нь програм хангамжийн системийн олон согогийг түүнийг хөгжүүлэх эсвэл шинэ функцийг хөгжүүлэх эхний үе шатанд нутагшуулж, арилгах боломжийг олгодог.

Туршиж буй модулиуд нь ихэвчлэн жижиг хэмжээтэй байдаг тул нэгжийн туршилтыг системийн туршилтын хамгийн энгийн (хэдийгээр цаг хугацаа их шаарддаг) үе шат гэж үздэг. Гэсэн хэдий ч энгийн хялбар байдлыг үл харгалзан нэгжийн туршилтад хоёр асуудал гардаг.

1. Тусдаа модуль гэж яг юу болохыг тодорхойлох нэгдсэн зарчим байдаггүй.

2. Нэгжийн туршилтын тухай ойлголтын тайлбарын ялгаа - энэ нь зөвхөн туршилтын орчинд дэмжигддэг модулийг тусад нь турших гэсэн үг үү, эсвэл модулийн зөв эсэхийг нэг хэсэг болгон шалгах асуудал уу. аль хэдийн хөгжсөн систем. Сүүлийн үед "нэгжийн туршилт" гэсэн нэр томъёог хоёр дахь утгаар нь илүү их ашигладаг байсан ч энэ тохиолдолд бид интеграцийн тестийн талаар илүү их ярьж байна.



Ачааж байна...
Топ