+ 이 글은 작성자가 직접 공부하고 복습하며 작성한 글입니다. 만약 직접 작성하지 않았다면, 꼭 출처를 밝히겠습니다!

 + 이 글은 개인적인 공부를 바탕으로 작성되었기에, 틀린 부분이 있을 수 있으며, 틀린 부분이 있다면 알려주시면 감사하겠습니다!

 + 이 글을 다른 곳으로 가져가신다면, 꼭 출처를 남겨주세요~

 + '참고사이트'는 공부하기 위해 참고한 사이트들을 모아 둔 것입니다.

 + 혹시라도 문제가 된다면 바로 조취를 취할테니, 말해주시면 감사하겠습니다!


Q. 매개변수가 있는 함수 호출이 더 빠르다???

 VisualStudio2017에서 매개변수 관련 실험을 하다 신기한 것을 발견했습니다.

 

 바로, 매개변수가 있는 함수 호출이 더 느리다는 것입니다! 

 

 매개변수가 있는 함수가 당연히 더 느릴 줄 알고, 얼마나 더 느린지 실험을 해보려고 한건데... 정반대의 결과가 나와서 참 당황스러웠습니다.


 실험했던 소스코드는 밑에 추가하겠습니다.


 대체 어느 곳에서, 무엇때문에 이런 결과가 나와버린 걸까요...?


<변화한 조건>

 1. 함수 정의 순서를 바꾼다. - [변화없음] 예상대로 주소로 접근하는거라 달라지지 않음.

 2. (결과변화없음) 함수명을 바꾼다.(test1 <-> test2) - [변화없음] 예상대로 주소로 접근하는거라 달라지지 않음.


<소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<iostream>
#include <time.h>
using namespace std;
 
int cnt = 0;
 
void test1() {
    cnt++;
}
 
void test2(int a, int b, int c) {
    cnt++;
}
 
int main() {
    clock_t start;
    clock_t end;
    bool asdf = true;
    int count = 0;
 
    int a = 3;
    int b = 5;
    int c = 12;
 
    while (count < 5) {
 
        start = clock();
 
        cnt = 0;
 
        for (int i = 0; i < 200000000; i++) {
            test1();
            //test2(a, b, c);
        }
 
        end = clock();
 
        cout << (double)(end - start) / CLOCKS_PER_SEC << endl;
 
        count++;
    }
    return 0;
}
 
cs

<소스코드 결과>
[test1] : 2.9 ~ 3.0 sec
[test2] : 2.8 ~ 2.9 sec


왜 이런 결과가 나오는 걸까요...?ㅠㅠ




Copyright © -강정이좋아- 무단 전재 및 재배포는 하지 말아주세요.

 + 이 글은 작성자가 직접 공부하고 복습하며 작성한 글입니다. 만약 직접 작성하지 않았다면, 꼭 출처를 밝히겠습니다!

 + 이 글은 개인적인 공부를 바탕으로 작성되었기에, 틀린 부분이 있을 수 있으며, 틀린 부분이 있다면 알려주시면 감사하겠습니다!

 + 이 글을 다른 곳으로 가져가신다면, 꼭 출처를 남겨주세요~

 + '참고사이트'는 공부하기 위해 참고한 사이트들을 모아 둔 것입니다.

 + 혹시라도 문제가 된다면 바로 조취를 취할테니, 말해주시면 감사하겠습니다!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace CS_Practice
{
    class Item
    {
        public string name;
        public static int count;
 
        public Item()
        {
            name = "a" + count++;
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            List<Item> list = new List<Item>();
 
            // 비어있는 상태에서 0번째로 들어감.
            list.Insert(0new Item());
 
            // 예상대로 맨 뒤에 들어감.
            list.Add(new Item());
 
            // 맨 앞으로 삽입!
            list.Insert(0new Item());
 
            // 맨 뒤로 들어감.
            list.Insert(3new Item());
 
            // *에러*
            // size는 4인데, 5번째 위치에 들어가려고 하니 에러 발생!
            list.Insert(5new Item());
 
            for(int i = 0; i<list.Count; i++)
            {
                if (list[i] != null)
                    Console.WriteLine("name : {0}", list[i].name);
                else
                    Console.WriteLine("null 값입니다.");
            }
 
            /*
             * <결과>
             * name : a2
             * name : a0
             * name : a1
             * name : a3
             * Error
             */
        }
    }
}
 
cs



Copyright © -강정이좋아- 무단 전재 및 재배포는 하지 말아주세요.

'재료들 > C#' 카테고리의 다른 글

[C#] get, set을 위한 속성(Property)  (0) 2018.05.14

 + 이 글은 작성자가 직접 공부하고 복습하며 작성한 글입니다. 만약 직접 작성하지 않았다면, 꼭 출처를 밝히겠습니다!

 + 이 글은 개인적인 공부를 바탕으로 작성되었기에, 틀린 부분이 있을 수 있으며, 틀린 부분이 있다면 알려주시면 감사하겠습니다!

 + 이 글을 다른 곳으로 가져가신다면, 꼭 출처를 남겨주세요~

 + '참고사이트'는 공부하기 위해 참고한 사이트들을 모아 둔 것입니다.

 + 혹시라도 문제가 된다면 바로 조취를 취할테니, 말해주시면 감사하겠습니다!


<clock()>

[Return]

 + 프로그램이 실행되고 나서 실행된 클럭 수를 반환합니다.


[Remarks]

 + 기본적으로 Microsoft에서는 1초 == 1000클럭으로 정의합니다. 따라서, 실행된 클럭 수를 비교해서, 그 차이만큼을 CLOCK_PER_SEC(==1000)로 나눠 실행시간을 측정합니다.

 + 이 함수는 최대 2147483.647초의 최대 클럭 기능 반환 값을 제공합니다. 이 시간보다 오래 실행된 프로세스에서 시계가 반환하는 값에 의존하지 마십시오.



<사용>

1. #include<ctime> 선언

2. clock_t 데이터형을 가진 변수 선언.(start, end)

3. clock()을 통해 start와 end에 실행된 클럭 수를 입력

4. start와 end 차이를 CLOCKS_PER_SEC로 나눠 실행시간 파악



<예시>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<iostream>
#include<ctime>
using namespace std;
 
#define FOR(x,y) for(int i = (x); i<(y); i++)
#define MAX 1000000
 
void asdf() {
    int temp1 = 0;
 
    FOR(010) {
        temp1 += i;
    }
}
 
void main() {
    clock_t start, end;
 
    // 시작 시간
    start = clock();
 
    FOR(0, MAX) {
        asdf();
    }
 
    // 끝난 시간
    end = clock();
 
    // 출력
    printf("%.3lf \n", (double)(end - start) / CLOCKS_PER_SEC);
}
cs




Copyright © -강정이좋아- 무단 전재 및 재배포는 하지 말아주세요.

+ Recent posts