A More Efficient Way To Write This Method

Hi Experts!

Thanks for reading this.

There has to be a more efficient way of handing the string manipulation.
One thought is it use StringBuilder and passing it as ref..
Each time the method is called it creates the parameter (StrTemp), if I'm not mistaken.
The following method (ConvertStringWithSomeLogic) gets called 130K times and it takes 2+ hrs to complete..

Here's how the method is being called:

private static void InsertIntoDBTable(List<Model3> MdlCombine)
{
    SomeDB db = new SomeDB();
        foreach (Model3 m in MdlCombine)
        {
            Model3 st = new Model3();
            st.packagecodeid = ConvertStringWithSomeLogic(m.packagecodeid);
            st.STARTDATE = (m.STARTDATE);
            st.ENDDATE = (m.ENDDATE);
            db.Model3s.Add(st);
        }
        db.SaveChanges();
}

Open in new window


Here's the method being called:
      private static string ConvertStringWithSomeLogic(string StrTemp)
        {
            string strReturn = StrTemp;
            try
            {
                int IntFirstDash = 0;
                int IntSecondDash = 0;
                GetDashPos(ref IntFirstDash, ref IntSecondDash, StrTemp);

                string strFirstSegment = StrTemp.Substring(0, IntFirstDash);
                string strSecondSegment = StrTemp.Substring(IntFirstDash + 1, IntSecondDash - (IntFirstDash + 1));
                string strThirdSegment = StrTemp.Substring(IntSecondDash + 1, StrTemp.Length - (IntSecondDash + 1));

                //CONVERT THE FIRST, SECOND, THIRD SEGMENTS
                ConvertFirstSegment(ref strFirstSegment);
                ConvertSecondSegment(ref strSecondSegment);
                ConvertThirdSegment(ref strThirdSegment);

                strReturn = strFirstSegment + strSecondSegment + strThirdSegment;

                if ((strFirstSegment.Length < 4) || (strSecondSegment.Length < 3) || (strThirdSegment.Length < 1))
                {
                    strReturn = StrTemp;
                    //write msg to event log with StrTemp in it
                }
            }
            catch ....            
            return (strReturn);
        }

Open in new window


Here are the Convert Segment methods:

        private static void ConvertFirstSegment(ref string FirstSeg)
        {
            if (FirstSeg.Length == 4)
            {
                FirstSeg = "0" + FirstSeg;
            }
        }

        private static void ConvertSecondSegment(ref string SecondSeg)
        {
            if (SecondSeg.Length == 3)
            {
                SecondSeg = "0" + SecondSeg;
            }
        }

        private static void ConvertThirdSegment(ref string ThirdSeg)
        {
            if (ThirdSeg.Length == 1)
            {
                ThirdSeg = "0" + ThirdSeg;
            }
        }

Open in new window


TIA!!
LVL 5
allanau20Asked:
Who is Participating?
 
Fernando SotoConnect With a Mentor RetiredCommented:
Hi allanau20;

Here is a link to a article SqlBulkCopy for Generic List<T> (useful for Entity Framework & NHibernate) I have not tried this myself but I did read over the code and see no reason why it would not work.

Hope this helps your issue.
0
 
James AtkinSenior Principle Software EngineerCommented:
Hi,

I have just minimised the code down to this:

private static string ConvertStringWithSomeLogic(string StrTemp)
{
            string strReturn = StrTemp;
            string[] arr = StrTemp.Split('-');
            String firstSeg = (arr[0].Length == 4 ? "0" + arr[0] : arr[0]);
            String secondSeg = (arr[1].Length == 3 ? "0" + arr[1] : arr[1]);
            String thirdSeg = (arr[2].Length == 1 ? "0" + arr[2] : arr[2]);
            strReturn = firstSeg + secondSeg + thirdSeg;
            if ((firstSeg.Length < 4) || (secondSeg.Length < 3) || (thirdSeg.Length < 1))
            {
                strReturn = StrTemp;
                //write msg to event log with StrTemp in it
            }
            //   ...
            return strReturn;
}

Open in new window


and it executed the function 130k times in about 40ms...

James
0
 
allanau20Author Commented:
Thanks James; let me try it now ..
0
Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
allanau20Author Commented:
I thought it was the method, but it's actually looping through the List of Model that's taking while to complete 130K records....
I'm going to catch some zzzzz....
0
 
Fernando SotoRetiredCommented:
Hi allanau20;

If you are trying to process 130K records to the database using Entity Framework then the most likely cause of the long time is Entity Framework. When Entity Framework does create, update and delete records it sends a single command for each record in the 130K records. Is this what you are attempting to do?
0
 
allanau20Author Commented:
Hey FernandoSoto.

Ok, I'll look into it in a few hours ...Thanks again.
0
 
PaulHewsCommented:
You may wish to turn off DetectChanges when adding large numbers of items to DBContext (I assume it's a DBContext?)

http://blog.oneunicorn.com/2012/03/12/secrets-of-detectchanges-part-3-switching-off-automatic-detectchanges/
0
 
allanau20Author Commented:
Hi PaulHews; yes, it's DBContext; I'll look into it. Thanks again.
0
 
Fernando SotoRetiredCommented:
Turning off DetectChanges will not help in this case because most of your time will be spent sending a single record at a time to the SQL server and getting a response back for each of the 130K records. That is a whole lot of network congestion.
0
 
allanau20Author Commented:
I tried the DetectChanges and that didn't speed things up; thanks though PaulHews .
0
 
allanau20Author Commented:
I'm sooo stoked; I figured out how to applied the example. LOL..

It works; this is soo cool .. now it runs under a minute... Thanks again FernandoSoto ... lunch on me if you're in town...
0
 
allanau20Author Commented:
awesome!
0
 
Fernando SotoRetiredCommented:
Not a problem allanau20, glad I was able to help.

Hay, what town would that be. LOL.
0
 
allanau20Author Commented:
check your gmail...
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.