간단한 함수 작성
5639 단어 함수.
우리의 최적화는 역효과를 낼 수 있다. 특히 네가 번역의 최적화를 시도해 봐라.
당신의 행동은 JIT 컴파일러의 최적화를 방해할 수 있습니다.
실제로 당신은 간단한 코드만 쓰고 다른 일은 JIT에 맡기면 됩니다.흔히 볼 수 있는 문제는 함수의 여러 번 호출을 피하기 위해 길고 복잡한 함수를 작성하는 것이다.
사실 이번에는 너의 프로그램을 더욱 느리게 만들었다.
CLR은 JIT 컴파일러를 통해 C#컴파일러가 생성한 IL 언어를 특정한 기계 언어로 컴파일합니다.
이 임무는 프로그램의 운행 주기 내에 대량으로 운행될 것이다.프로그램이 실행될 때, CLR은 함수를 기본 단위로 JIT 컴파일러를 터치합니다.
작은 함수는 프로그램의 시작 속도를 높일 수 있지만, 반대로 긴 프로그램이 실행될 때 IL 코드를 모두 컴파일하면 프로그램을 비교적 긴 대기 상태로 만들 수 있다.
우리는 JIT가 컴파일과 무관한 코드를 줄일 수 있도록 코드를 작은 함수로 재구성할 수 있다.예:
1: public string BuildMsg(bool takeFirstPath)
2: {
3: StringBuilder msg = new StringBuilder();
4: if (takeFirstPath)
5: {
6: msg.Append("A problem occurred!");
7: msg.Append("Error!");
8: }
9: else
10: {
11: msg.Append("This is not bad!");
12: msg.Append("Success!!");
13: }
14: return msg.ToString();
15: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
BuildMsg 함수가 처음 호출되면 모든 브랜치가 컴파일됩니다.하지만 실제로는 한 지점만 운행한다.
다음 코드를 쓰면 상상해 보세요.
1: public string BuildMsg2(bool takeFirstPath)
2: {
3: StringBuilder msg = new StringBuilder();
4: if (takeFirstPath)
5: {
6: return FirstPath();
7: }
8: else
9: {
10: return SecondPath();
11: }
12: }
13:
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
프로그램 분기의 문장이 함수를 재구성하기 때문에 프로그램이 실행될 때 JIT는 컴파일된 코드를 줄일 수 있다.이 예는 설명을 위해 특별히 설계된 것으로 운행할 때 별 차이가 없을 수 있다.근데 우리 실제 개발에서 이런 코드를 많이 썼는지 생각해봐.만약 프로그램이 20개 이상의 지점을 포함한다면, 프로그램이 처음 실행될 때 JIT 컴파일러가 모든 지점을 컴파일할 것이다.만약 지점이 알 수 없는 오류 때문에 JIT 컴파일링의 운행 시간을 완전히 피할 수 있다.
짧고 간결한 방법은 JIT 컴파일러가 enregistration을 지원하기 쉽게 할 수 있다. enregistration은 어떤 국부 변수를 레지스터에 저장하고 창고에 저장하지 않는 것을 말한다. 비교적 적은 국부 변수는 JIT 컴파일러가 가장 적합한 enregistration 선택을 하기 쉽고 방법에서 흐름을 제어하는 간단성도 JIT 컴파일러가 어떻게 더 좋은 enregistration을 하는지에 영향을 미친다.
JIT 컴파일러는 또한 내연 방법에 대해 결정을 한다. 내연은 함수 호출을 함수 체내의 코드로 직접 바꾸는 것을 의미한다. 예를 들어 속성 중의 get과 set 액세서리는 내연 방법으로 간주된다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
예를 들어 urlopen의 데이터 사용법데이터 매개 변수는 선택할 수 있습니다. 데이터를 추가하려면 바이트 인코딩 형식의 내용, 즉bytes 형식이면bytes () 함수를 통해 전환할 수 있습니다. 또한 이 데이터 매개 변수를 전달하면 GET 방식으로 요...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.