Shamil Salakhetdinov
shamil at users.mns.ru
Mon Oct 31 04:34:11 CST 2005
Gustav, I think if you say that you have forgotten 99% Fortran then you can convert your code into C++ with same efforts as on Fortran. I mean - if your code is just "arrays shuffling" as you say then VB(A)-> C++ conversion is almost line by line... I did recheck - your code runs just in 5 seconds on VB6 with array bounds checks and integer overflow checks switched off. These are 100,000,000 loops. I did also test your sample code on C# and VB.NET - and it runs in 5-6 seconds with switched off integer overflow checks (it looks that there is no way to switch off array bounds checks for C# and VB.NET) . Here is VB.NETcode I used for testing: VB.NET ----------- Module testArrays Sub Main() Dim lngResult As Long = 0 Dim lngCnt As Long = 0 Dim lngTotalCnt As Long = 0 lngResult = ArrayTimeLocal(1000000, lngTotalCnt) lngTotalCnt += lngCnt Console.WriteLine(String.Format( _ "Final Result = {0:#,##0}, Final Counter = {1:#,##0}", _ lngResult, lngTotalCnt)) End Sub Function ArrayTimeLocal(ByVal lngLoopMax As Long, ByRef lngTotalCnt As Long) As Long Const lngItems As Long = 100 Dim alngTmp(lngItems - 1, 1) As Long Dim lngLoop As Long Dim lngItem As Long Dim lngResult As Long Dim lngSeconds As Long Dim dblStart As Double Dim dblStop As Double Dim lngCnt As Long = 0 dblStart = Timer For lngLoop = 0 To lngLoopMax - 1 For lngItem = 0 To lngItems - 1 alngTmp(lngItem, 1) = lngLoop * 10 If alngTmp(lngItem, 1) / 10 = 100 Then lngResult = 1 Else lngResult = 0 End If lngCnt += 1 Next Next dblStop = Timer lngSeconds = CLng(dblStop - dblStart) lngTotalCnt = lngCnt ArrayTimeLocal = lngSeconds End Function End Module Output ---------- Final Result = 5, Final Counter = 100,000,000 C# === using System; using Microsoft.VisualBasic; namespace testArraysCS { class TestArrays { [STAThread] unsafe static void Main(string[] args) { long lngTotalCnt = 0; long lngResult = 0; lngResult = ArrayTimeLocal(1000000, ref lngTotalCnt); Console.WriteLine(String.Format( "Final Result = {0:#,##0}, Final Counter = {1:#,##0}", lngResult, lngTotalCnt)); } unsafe static long ArrayTimeLocal(long lngLoopMax, ref long lngTotalCnt) { const long lngItems = 100; long[,] alngTmp = new long[lngItems,1] ; long lngLoop; long lngItem; long lngResult=0; double dblStart; double dblStop; long lngSeconds; Console.WriteLine("Array looping test started..."); dblStart = Microsoft.VisualBasic.DateAndTime.Timer; lngTotalCnt = 0; for (lngLoop=0; lngLoop < lngLoopMax; lngLoop++) { for (lngItem=0; lngItem < lngItems; lngItem++) { alngTmp[lngItem,0] = lngLoop * 10; if (alngTmp[lngItem,0] / 10 == 100) lngResult = 1; else lngResult = 0; lngTotalCnt++; } } dblStop = Microsoft.VisualBasic.DateAndTime.Timer; Console.WriteLine("Array looping test ended."); lngSeconds = (long)(dblStop - dblStart); return lngSeconds; } } } Output --------- Array looping test started... Array looping test ended. Final Result = 6, Final Counter = 100,000,000 Recapitulation: =========== C++ & Fortran (and COBOL?) rule and rock forever! :) Shamil ----- Original Message ----- From: "Gustav Brock" <Gustav at cactus.dk> To: <accessd at databaseadvisors.com> Sent: Monday, October 31, 2005 11:51 AM Subject: Re: [AccessD] Array faster in DLL? > Hi Marty > > Thanks! For those of you working with dot net note that this compiler (also) integrates with Visual Studio. > However, it is so many years since I touched Fortran as a happy student that I have forgotten it 99%. > It certainly looks like a perfect choice for heavy floating point operations - which I don't need - at a fair cost. > > It could be interesting to see how the computing time would be in VB(A) for the sinus approximation sample here: > > http://www.intel.com/software/products/compilers/fwin/docs/Getting_Started.htm > > /gustav > > >>> martyconnelly at shaw.ca 30-10-2005 22:37:35 >>> > Oopps here is the url > For Intel Fortran Note: it also optimizes on array loops for parallel > processing assuming multi cores. > > http://www.intel.com/cd/software/products/asmo-na/eng/compilers/fwin/219725.htm > > > -- > AccessD mailing list > AccessD at databaseadvisors.com > http://databaseadvisors.com/mailman/listinfo/accessd > Website: http://www.databaseadvisors.com