문제

빠른가?ByVal 또는 ByRef? 나 궁금했는지 여부 의견에았다이 적용됩 Strings 성능 측면에서.이 문자열은 복사에 전달되기 전에,그렇지 않다 훨씬 더 많은 효율적인(만약 제출하지 않는 사본이 필요하의 문자열이론)문자열을 전달하 ByRef?

감사합니다,
CFP.

편집: 이 코드는 나를 생각하게 만드는 몇 가지 종류의 복사가:

Sub Main()
    Dim ByValStr As String = "Hello World (ByVal)!"
    Dim ByRefStr As String = "Hello World (ByRef)!"

    fooval(ByValStr)
    fooref(ByRefStr)

    Console.WriteLine("ByVal: " & ByValStr)
    Console.WriteLine("ByRef: " & ByRefStr)

    Console.ReadLine()
End Sub


Sub fooval(ByVal Str As String)
    Str = "foobar"
End Sub

Sub fooref(ByRef Str As String)
    Str = "foobar"
End Sub

출력:

ByVal: Hello World (ByVal)!
ByRef: foobar
도움이 되었습니까?

해결책

strings 은 전달되기 전에 복사되지 않습니다.문자열은 다소 값 유형 유형을 동작 시켜도 참조 유형입니다.

요구 사항의 맥락에서 가장 의미가있는 것이 무엇이든지 사용해야합니다.(그리고 귀하의 요구 사항이 모든 다른 고려 사항을 희생시킬 때마다 성능의 모든 나노초를 쥐어 짜여야합니다 "라는 일이 일어납니다.

이것은 거의 확실히 당신이 걱정할 필요가없는 것입니다. 그리고 상당한 성능 차이가 있는지 의심 스럽습니다.차이를 볼 수있는 유일한 상황은 big 값 유형을 전달할 때 발생합니다.

다른 팁

나는 이것을 자신을 위해 확인하기로 결정하여 더 많은 "과학적"답변을 얻기로 결정했습니다.그들은 동일합니다.아래 코드를 사용하는 경우 ByVal은 ByVef보다 약 2 % 느립니다.그러나 Byval 이전에 ByRef가 타이밍되도록 주위를 교환하면 ByRef가 약 2 % 느립니다.따라서 실제로 ByRef 또는 Byval보다 중요한 것은 실행되는 순서입니다.)

Function CreateString()

    Dim i As Integer
    Dim str As String = ""

    For i = 1 To 10000
        str = str & "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Next i

    Return str
End Function

Sub fooval(ByVal Str As String)
    Str = Str & "foobar"
End Sub

Sub fooref(ByRef Str As String)
    Str = Str & "foobar"
End Sub

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim str As String = CreateString()
    Dim stopWatch As New Stopwatch
    Dim i As Integer

    stopWatch.Start()
    For i = 1 To 1000
        fooval(str)
    Next i
    stopWatch.Stop()
    Dim valtime As Long = stopWatch.ElapsedMilliseconds

    stopWatch.Restart()
    For i = 1 To 1000
        fooref(str)
    Next i
    stopWatch.Stop()
    Dim reftime As Long = stopWatch.ElapsedMilliseconds

    MsgBox("Val took " & valtime & " milliseconds and Ref took " & reftime & " milliseconds")
End Sub
.

하의 행동을 이해하는 클래스 형식 문자열을 포함,,와 관련하여 모든 클래스-입력 매개 변수를 변수 필드 배열 요소,등등.으로 들고"개체 id".는 경우 Foo 은 변수의 유형 string, 문 Foo = 12345.ToString(); 이 만들어 새로운 객체 id(꼽,객체 ID#197),그리고 새로운 객체를 만들의 유형 string 해당 id 를 들고 다섯 가지 캐릭터 "12345".그런 다음점 Object ID#197 로 변수 Foo.는 경우 호출이 일상적인 비 ref 매개변수 param, 고 전달 Foo 면,다음 param 이 될 지역 변수를 잡고 Object ID #197.문의 param += "6"; 을 만들 것이라 새로운 객체(예:객체 ID#521),의 형식 문자열을 들고,여자 "123456" 저장 Object ID #521param.Note FooObject ID#197, 는 개체는 계속 보유하고 다섯은-문자열 "12345".

는 경우 param 되었으로 전달 ref, 다음 문장 param += "6" 저장해야 Object ID #521Foo.그것은 여전히 있지 않을텐데 발생하는 모든 현저한 변경을 개체#197 를 제외하고,아마도 그것을 만들 자격에 대한 쓰레기 컬렉션(는 경우 Foo 었지만 참조하여 개체#197,덮어 쓰기하는 것을 의미가 더 이상 존재하는 어떤 참조하여 해당 개체 어디서나 우주에서).

참고로 일반적으로 아주 쉽게 이유에 대해 변경할 수 없는 클래스 형식 string, 도 생각하지 않고의 측면에서 객체 Id,이는 유일한 방법을 변경하는 일련의 문자로 표현된 문자열 변수를 저장하는 것 다른 객체 ID 다.의 관점에서 생각하고 객체 Id 가 필수적이다,그러나,다룰 경우는 변경하는 클래스 형식입니다.전달하는 변수의 클래스 형식 Car, 지 ref,에 해당하는 것 복사 VIN 중 하나에서 미끄러짐의 종이,다른 그리고 수교 후자 쪽지를 일부 노동자들니다 그것으로 뭔가를 할 수 있습니다.는 경우 첫 번째 종이 원래 식별 빨간 자동차와 VIN#15934,그 때 근로자들은 처음에는 종이 있을 식별 블루 자동차와 VIN#15934 지만,그것은 것 같은 차입니다.아무것도 노동자들을 할 수 있으로 미끄러짐의 종이 그들이 받았으며,그들은 아무것도 할 수 있으로 자동차에,변경하는 자동차의 첫 번째 종이라고 합니다.다른 한편으로 전달하는 매개변수 참조에 의해 더 많은 것 같은 노동자의 조각으로 종이 VIN 작성하고,종이 뒤에서 그 때 그들은 했다.는 경우에는 근로자 수 십자가 VIN 고 쓰는 다른 다음,그들이 돌아왔을 때 미끄러짐의 종이 그것을 참조할 수 있습 같은 자동차 또는 다른 차;을 참조하는 경우 다른 자동차,자동차가 어떤 이것은 원래 있지 않을 수 있습이 수정되고 자동차는 종이 끝나는 참조되지 않는 모든 유사하다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top