2013-09-10 1 views
3

저는 VB.NET에 비교적 익숙하지 않으므로 프로그래밍에 대해 스스로 가르치므로 기초 지식과 개념이 많이 없으므로 제 솔직함과 무지를 변명하십시오.한 문장으로 코드를 작성하는 데 더 많은 오버 헤드가 있습니까?

VB 기능을 단계별로 또는 한 줄의 긴 코드로 작성하는 데있어 물류, 성능 및 효율성에 대해 궁금합니다.

다음은 일부 프로그램에서 HTML을 구문 분석하는 작은 함수입니다. 코드는 임의의 예제이며 두 코드 블록 모두 정확히 동일한 기능을 수행합니다. 여기에는 하나의 길고 간결한 코드와는 달리 길고 절차 적으로 선언 된 분열 된 코드의 요점을 설명하기 위해 여기에 나와 있습니다.

  1. 긴 코드

    Dim html As String 
    Dim htmlString As String 
    Dim dIndex As Integer 
    html = WebBrowser.DocumentText 
    htmlString = "size=" & Chr(34) & "15" & Chr(34) & " maxlength=" & Chr(34) & "40" & Chr(34) & ">" 
    dIndex = html.IndexOf(htmlString) 
    If (dIndex > -1) Then 
        Dim lIndex As Integer 
        Dim sDomain As String 
        sDomain = html.Substring(dIndex + 26, 20) 
        lIndex = sDomain.IndexOf("<") 
        LblSubDomain.Text = sDomain.Substring(0, lIndex) 
    Else 
        LblSubDomain.Text = "Cannot Find Sub Domain Extension" 
    End If 
    
  2. 짧은 코드

    If (WebBrowser.DocumentText.IndexOf("size=" & Chr(34) & "15" & Chr(34) & " maxlength=" & Chr(34) & "40" & Chr(34) & ">") > -1) Then 
        LblSubDomain.Text = WebBrowser.DocumentText.Substring(WebBrowser.DocumentText.IndexOf("size=" & Chr(34) & "15" & Chr(34) & " maxlength=" & Chr(34) & "40" & Chr(34) & ">") + 26, 20).Substring(0, WebBrowser.DocumentText.Substring(WebBrowser.DocumentText.IndexOf("size=" & Chr(34) & "15" & Chr(34) & " maxlength=" & Chr(34) & "40" & Chr(34) & ">") + 26, 20).IndexOf("<")) 
    Else 
        LblSubDomain.Text = "Cannot Find Sub Domain Extension" 
    End If 
    

내 질문은 : 성능에 최소한의 영향이 있거나 수행하는 코드의 두 블록의 VB2012 코드를 한 줄로 컴파일하면 아무런 차이가 없습니까?

너무 많은 너희들을 감사하고 내 질문은 스택 오버플로

의 기대
+1

두 번째 버전이 더 효율적인 코드로 컴파일되는지 여부는 알 수 없지만 유지 관리해야한다면 지옥과 등 뒤로 모든 것을 저주합니다. 첫 번째 버전의 사소한 성능 저하는 가독성으로 인해 크게 상회합니다. –

+0

나는 알고있다.개인적으로는 일단 기능을 다 끝내면 다른 곳으로 집중할 수 있도록 내 눈에 띄지 않게 배송하고 싶습니다. 크기가 작을수록 코드를 더 쉽게 탐색 할 수 있습니다. – Iniquity666

답변

2

효과적으로 동일한 코드를, 성능 현명한 생산할 예정의 범위 내에 있기를 바랍니다. 이 비주얼 스튜디오 통해 분기점 쉽게 주사 가능 같은 유지 보수 및 디버깅 관점 옵션 # 1에서

훨씬 바람직하며 작은 각 라인 로직의 양으로 이해하는 것은 일반적으로 용이하다.

사실, 두 가지 옵션 사이의 행복 매체를 옹호을 부를 것이다 옵션 # 1.5 :

Dim html As String = WebBrowser.DocumentText 
Dim htmlString As String = "size=" & Chr(34) & "15" & Chr(34) & " maxlength=" & Chr(34) & "40" & Chr(34) & ">" 
Dim dIndex As Integer = html.IndexOf(htmlString) 

If (dIndex > -1) Then 
    Dim lIndex As Integer = sDomain.IndexOf("<") 
    Dim sDomain As String = html.Substring(dIndex + 26, 20) 

    LblSubDomain.Text = sDomain.Substring(0, lIndex) 
Else 
    LblSubDomain.Text = "Cannot Find Sub Domain Extension" 
End If 

이 코드의 적은 총 라인 수 있지만 가독성, 유지 보수 및 debuggability의 대부분을 유지하는 옵션 # 1이 제공됩니다. 여기

는 반사판을 통해 중간 언어 (IL)에 디 컴파일 코드입니다 :

참고 : MySub()는 IL로 디 컴파일 옵션 # 1.

.method public instance void MySub() cil managed 
{ 
    .maxstack 4 
    .locals init (
     [0] int32 num, 
     [1] string str, 
     [2] string str2, 
     [3] int32 num2, 
     [4] string str3, 
     [5] bool flag) 
    L_0000: nop 
    L_0001: ldarg.0 
    L_0002: callvirt instance class [System.Windows.Forms]System.Windows.Forms.WebBrowser WindowsApplication3.Form1::get_WebBrowser() 
    L_0007: callvirt instance string [System.Windows.Forms]System.Windows.Forms.WebBrowser::get_DocumentText() 
    L_000c: stloc.1 
    L_000d: ldstr "size=\"15\" maxlength=\"40\">" 
    L_0012: stloc.2 
    L_0013: ldloc.1 
    L_0014: ldloc.2 
    L_0015: callvirt instance int32 [mscorlib]System.String::IndexOf(string) 
    L_001a: stloc.0 
    L_001b: ldloc.0 
    L_001c: ldc.i4.m1 
    L_001d: cgt 
    L_001f: stloc.s flag 
    L_0021: ldloc.s flag 
    L_0023: brfalse.s L_0057 
    L_0025: ldloc.1 
    L_0026: ldloc.0 
    L_0027: ldc.i4.s 0x1a 
    L_0029: add.ovf 
    L_002a: ldc.i4.s 20 
    L_002c: callvirt instance string [mscorlib]System.String::Substring(int32, int32) 
    L_0031: stloc.s str3 
    L_0033: ldloc.s str3 
    L_0035: ldstr "<" 
    L_003a: callvirt instance int32 [mscorlib]System.String::IndexOf(string) 
    L_003f: stloc.3 
    L_0040: ldarg.0 
    L_0041: callvirt instance class [System.Windows.Forms]System.Windows.Forms.Label WindowsApplication3.Form1::get_LblSubDomain() 
    L_0046: ldloc.s str3 
    L_0048: ldc.i4.0 
    L_0049: ldloc.3 
    L_004a: callvirt instance string [mscorlib]System.String::Substring(int32, int32) 
    L_004f: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Label::set_Text(string) 
    L_0054: nop 
    L_0055: br.s L_0069 
    L_0057: nop 
    L_0058: ldarg.0 
    L_0059: callvirt instance class [System.Windows.Forms]System.Windows.Forms.Label WindowsApplication3.Form1::get_LblSubDomain() 
    L_005e: ldstr "Cannot Find Sub Domain Extension" 
    L_0063: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Label::set_Text(string) 
    L_0068: nop 
    L_0069: nop 
    L_006a: nop 
    L_006b: ret 
} 

참고 : MySub2()은 IL로 디 컴파일 된 옵션 2입니다.

.method public instance void MySub2() cil managed 
{ 
    .maxstack 6 
    .locals init (
     [0] bool flag) 
    L_0000: nop 
    L_0001: ldarg.0 
    L_0002: callvirt instance class [System.Windows.Forms]System.Windows.Forms.WebBrowser WindowsApplication3.Form1::get_WebBrowser() 
    L_0007: callvirt instance string [System.Windows.Forms]System.Windows.Forms.WebBrowser::get_DocumentText() 
    L_000c: ldstr "size=\"15\" maxlength=\"40\">" 
    L_0011: callvirt instance int32 [mscorlib]System.String::IndexOf(string) 
    L_0016: ldc.i4.m1 
    L_0017: cgt 
    L_0019: stloc.0 
    L_001a: ldloc.0 
    L_001b: brfalse.s L_008f 
    L_001d: ldarg.0 
    L_001e: callvirt instance class [System.Windows.Forms]System.Windows.Forms.Label WindowsApplication3.Form1::get_LblSubDomain() 
    L_0023: ldarg.0 
    L_0024: callvirt instance class [System.Windows.Forms]System.Windows.Forms.WebBrowser WindowsApplication3.Form1::get_WebBrowser() 
    L_0029: callvirt instance string [System.Windows.Forms]System.Windows.Forms.WebBrowser::get_DocumentText() 
    L_002e: ldarg.0 
    L_002f: callvirt instance class [System.Windows.Forms]System.Windows.Forms.WebBrowser WindowsApplication3.Form1::get_WebBrowser() 
    L_0034: callvirt instance string [System.Windows.Forms]System.Windows.Forms.WebBrowser::get_DocumentText() 
    L_0039: ldstr "size=\"15\" maxlength=\"40\">" 
    L_003e: callvirt instance int32 [mscorlib]System.String::IndexOf(string) 
    L_0043: ldc.i4.s 0x1a 
    L_0045: add.ovf 
    L_0046: ldc.i4.s 20 
    L_0048: callvirt instance string [mscorlib]System.String::Substring(int32, int32) 
    L_004d: ldc.i4.0 
    L_004e: ldarg.0 
    L_004f: callvirt instance class [System.Windows.Forms]System.Windows.Forms.WebBrowser WindowsApplication3.Form1::get_WebBrowser() 
    L_0054: callvirt instance string [System.Windows.Forms]System.Windows.Forms.WebBrowser::get_DocumentText() 
    L_0059: ldarg.0 
    L_005a: callvirt instance class [System.Windows.Forms]System.Windows.Forms.WebBrowser WindowsApplication3.Form1::get_WebBrowser() 
    L_005f: callvirt instance string [System.Windows.Forms]System.Windows.Forms.WebBrowser::get_DocumentText() 
    L_0064: ldstr "size=\"15\" maxlength=\"40\">" 
    L_0069: callvirt instance int32 [mscorlib]System.String::IndexOf(string) 
    L_006e: ldc.i4.s 0x1a 
    L_0070: add.ovf 
    L_0071: ldc.i4.s 20 
    L_0073: callvirt instance string [mscorlib]System.String::Substring(int32, int32) 
    L_0078: ldstr "<" 
    L_007d: callvirt instance int32 [mscorlib]System.String::IndexOf(string) 
    L_0082: callvirt instance string [mscorlib]System.String::Substring(int32, int32) 
    L_0087: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Label::set_Text(string) 
    L_008c: nop 
    L_008d: br.s L_00a1 
    L_008f: nop 
    L_0090: ldarg.0 
    L_0091: callvirt instance class [System.Windows.Forms]System.Windows.Forms.Label WindowsApplication3.Form1::get_LblSubDomain() 
    L_0096: ldstr "Cannot Find Sub Domain Extension" 
    L_009b: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Label::set_Text(string) 
    L_00a0: nop 
    L_00a1: nop 
    L_00a2: nop 
    L_00a3: ret 
} 

참고 : Reflector 더 이상 시험 기간 이상 무료 제품이지만, 코드의 IL을 얻을 수있는 무료 대안이있다 (ildasm는 .NET Framework 및 ILSpy에 내장 된 도구는 오픈입니다입니다 Reflector에 대한 소스 응답이 더 이상 무료가 아님)

+0

감사합니다. Karl. 성능이 동일한 지 확인할 수 있습니까? 질문을 약간 열어 놓고 희망이 끝나면 일반적인 실습 팁을 받게됩니다. 1.5 매체에 감사드립니다. 디버깅의 진정한 필요성을 이해하도록 도와 줄 수 있습니까? 내 이해는 그것이 작동한다면 그것은 작동합니다. 아직 디버깅의 진정한 목적과 실전을 배웠습니다. 성능과 효율성이라고 생각했던 코드 스타일링이되었습니다. – Iniquity666

+0

+ @ Iniquity666 : 칼의 권리. 성능은 조금이라도 영향을받지 않습니다. 디버깅은 당신이 잘해야 할 일입니다. 프로그램을 작성할 때 실수없이 작성하는 것은 매우 드뭅니다. 중단 점을 설정하고 줄 단위로 코드를 단계별로 실행하고 데이터를 검토하는 방법을 배우면 실수를 찾아 수정할 수 있습니다. 행운을 빕니다! –

+0

@ Iniquity666 - 각각의 옵션에 대해 디 컴파일 된 코드 (일리노이)를 게시했으며 본질적으로 동일한 것을 수행하고 있음을 알 수 있습니다. Option # 1은 더 많은 항목을 스택에 저장한다 ('.locals init'). 왜냐하면 Option # 2는 코드 자체에서 값을 얻기 위해 몇 번 더 호출하는 반면, Dim은 수행 중이기 때문이다. –

관련 문제