xsharp.eu • StrTran
Page 1 of 1

StrTran

Posted: Fri Oct 23, 2020 12:51 pm
by Horst
Hallo
In meinem Code brauche ich tonnenweise Strtran () nun habe ich mal ein 51MB in einen String geladen und den mit StrTran und Net.Replace bearbeitet.

cTextIn := myReadAllLines (WorkDir()+"test.txt")
SELF:WriteCgiLog (NTrim (Seconds()))
cTextOut := cTextIn:Replace ("Variables","Lolobeifuerzwei")
SELF:WriteCgiLog (NTrim (Seconds()))
cTextOut2 := StrTran (cTextIn ,"Variables","Lolobeifuerzwei")
SELF:WriteCgiLog (NTrim (Seconds()))

StrTran braucht die doppelte Zeit. Wie kann man nachschauen , wie StrTran umgesetzt wurde?

Ich habe dann noch das versucht und das ist gleich schnell wie Variante 1
cTextOut3 := myStrTran (@cTextIn ,"Variables","Lolobeifuerzwei")
FUNCTION myStrTran (cInput REF STRING, cSuch AS STRING, cReplace AS STRING) AS STRING
RETURN cInput:Replace(cSuch,cReplace)

Liegt es daran, dass StrTran noch nStart und nCount hat ?
Gruss
Horst

StrTran

Posted: Fri Oct 23, 2020 12:56 pm
by wriedmann
Hallo Horst,
StrTran() ist nicht streng typisiert, das macht sicher was aus.
Ansonsten: in der X# Hilfe gibt es einen Button "Source":
https://github.com/X-Sharp/XSharpPublic ... String.prg
Eine .NET-Methode ist sicher schneller, muss aber per try-catch abgesichert werden.
Wolfgang

StrTran

Posted: Fri Oct 23, 2020 1:10 pm
by Horst
Hallo Wolfgang
Wieso muss sie abgesichert werden ?

StrTran

Posted: Fri Oct 23, 2020 1:30 pm
by wriedmann
Hallo Horst,
da gab es erst kürzlich eine Diskussion drüber.
Die meisten Methoden in .NET werfen eine Exception, wenn eine nicht erwartete Situation auftritt, z.B. ein übergebener String Null ist oder so ähnlich.
String.Replace scheint da eh recht tolerant zu sein, die Methode verträgt es laut Doku nur nicht, wenn der Quellstring entweder Null oder leer ist (StrTran macht es nichts aus, wenn der erste Parameter "" ist).
Wolfgang

StrTran

Posted: Fri Oct 23, 2020 2:37 pm
by Chris
Guys,

When the input string is 51 MB, I doubt that there's any noticeable speed difference because of StrTran() being untyped, you would definitely notice this difference for many calls to StrTran() with smaller strings.

I suspect that the main reason why String.Replace() is faster than StrTran() with huge strings, is that it is implemented internally in the Framework, probably in c++ or assembly, which will always be faster than a function implemented in IL, like STrTran().

StrTran

Posted: Fri Oct 23, 2020 10:47 pm
by Jamal
Hi All,

Chris is right (of course). The .NET string.replace internally calls a C++ function.

https://github.com/g15ecb/shared-source ... .cpp#L1572

Horst, while the X# StrTran() may be more flexible, however, you may create a wrapper to call the string.replace; Still it should be much faster.

I believe, the same can be said about the .NET string methods listed below (C#) which would be much faster due to underlying c++ code:

Concat(Object)
Insert(Int32, String)
Join(String, String[])
Remove(Int32, Int32)
Split(Char[])
Substring(Int32)
Trim(Char[])

Jamal