안녕하세요. 그간 몇가지의 질문을 올리고싶었지만, 하루만 더 하루만 더 찾아보고 반복해서 해결을 해왔습니다. 질문을 올리기가 뭔가 조심스럽네요…!
오늘 여쭤보고자 각잡고 글을 쓰는 질문은 제 실력으로는 도저히 가능한지, 불가능한지 판단조차 서지 않아 우선은 가볍게… 가능여부를 좀 여쭈어보고 싶어서입니다.
일단은 프로그램이 조금 난잡한 부분이 있습니다. 워낙 초보인데다… 짜집기로 만들다보니…
주 기능은, 실시간으로 올라오는 텍스트파일을 “한 줄씩” 읽고 계산해서 반영해주는 프로그램입니다.
수백kb단위의 용량은 더이상 빠를 필요가 없을 정도로 잘 계산해주고 있는데,
1-2분만에 100메가에 근접하는 정도의 파일 처리는 너무 느리더라구요.
라인수로는 1-2분만에 약 100만줄가량 생성이 됩니다.
대미지를줬습니다Regex = new Regex(timeStampRegex + "(치명타! )?((?<name>.+)[이가] )?(((?<skill>.+)[을를] 사용해 )|공격을 반사하여 )?(?<target>.+)(에게|[이가]) (?<damage>[^a-zA-Z]+)의 (|치명적인 )대미지를 (줬습니다|주고 문양 각인 효과가 발생|(받고|입고) 일부 강화 마법이 제거됐습니다)", RegexOptions.Compiled);
대미지를받았습니다Regex = new Regex(timeStampRegex + "(치명타! )?((?<name>.+)[이가] )?((?<from>.+)에게서 |(?<skill>.+)의 효과로 )(?<damage>[^a-zA-Z]+)의 (치명적인 )?((중독|출혈) )?대미지를 받았습니다", RegexOptions.Compiled);
위같은 정규식으로 처리하는 항목이 20여개정도되고
public void AddHeal(RecoverEventArgs e)
{
this.HealAmount += e.Amount;
if (Class == ClassType.NONE)
{
Class = SkillDictionary.GetClass(e.Skill);
}
this.HealLogList.Add(e.log);
HealSkillEntity entity = null;
foreach (HealSkillEntity hse in HealList)
{
if (hse.Target == e.Name)
{
entity = hse;
break;
}
}
if (entity == null)
{
entity = new HealSkillEntity();
entity.Target = e.Name;
this.HealList.Add(entity);
}
entity.TotalRecover += e.Amount;
entity.Count++;
}
위 같은 항목들이 모여서
public void UpdataListView2()
{
dd1 = ((double)NewTotalDealCount / (double)TotalDealTime); //22-05-04 두줄 새공비 추가
rd3 = Math.Round(dd1, 2);
if (ListItem.SubItems[1].Text == "")
{
ListItem.SubItems[1].Text = SkillDictionary.GetClassString(Class);
}
ListItem.SubItems[3].Text = DPS + ""; //DPS
ListItem.SubItems[4].Text = String.Format("{0:#,0}", TotalDamage) + ""; //누적딜 23.07.20. 콤마 표시
ListItem.SubItems[5].Text = TotalDealTime + "초"; //딜시간
ListItem.SubItems[6].Text = PercentNormalCancel + "%"; //평캔
ListItem.SubItems[7].Text = rd3 + ""; //새공비
ListItem.SubItems[8].Text = percentCritical + "%"; //스킬치명
ListItem.SubItems[9].Text = HealAmount + ""; //힐량
ListItem.SubItems[10].Text = percentSkill + "%"; //스킬퍼센트
ListItem.SubItems[11].Text = percentNormal + "%"; //평타퍼센트
ListItem.SubItems[12].Text = MaxDamage + ""; //한방
ListItem.SubItems[13].Text = NewTotalNormalDealCount + "회"; //평타공격
ListItem.SubItems[14].Text = NewTotalSkillDealCount + "회"; //스킬공격
ListItem.SubItems[15].Text = NewTotalDealCount + "회"; //새공격
ListItem.SubItems[16].Text = TotalNormalCancelCount + "회"; //총평캔수
ListItem.SubItems[17].Text = MaxNormalCancelCount + "회"; //최대평캔수
ListItem.SubItems[18].Text = TotalDealCount + "회"; //공격수
ListItem.SubItems[19].Text = (NewTotalNormalDealCount == 0) ? "0" : (NewTotalNormalDamage / NewTotalNormalDealCount) + ""; //평타평균
ListItem.SubItems[20].Text = (NewTotalSkillDealCount == 0) ? "0" : (NewTotalSkillDamage / NewTotalSkillDealCount) + ""; //스킬평균
ListItem.SubItems[21].Text = (NewTotalDealCount == 0) ? "0" : (TotalDamage / NewTotalDealCount) + ""; //평균딜
ListItem.SubItems[22].Text = HPRecover + ""; //HP회복
ListItem.SubItems[23].Text = MPRecover + ""; //MP회복
}
위처럼 만들어서
else
{
user.AddRecover(e);
this.BeginInvoke(new EventHandler(delegate (object s, EventArgs ee)
{
user.UpdataListView();
}));
}
이런식으로 보여지게 되는거같습니다.
(처음부터 제가 만든게 아니라서…)
몇명의 정보는 아주 아무런 문제가 없는데
인원이 많아지고 정보량이 많아지면 실제로 1초의 정보를 처리하는데 10초 20초이상이 걸리더라구요.
이게 처리속도의 문제인지, 폼에서 보여지는 부분들이 새로고침되는 속도의 문제(?)인지
궁금하고, 개선의 여지가 있는지도 궁금합니다…!!
정렬은 사용하지 않고,(옵션으로 온오프가능)
폼에서 보여지는 라인은 실제로 2-300라인인데,
한 라인 한라인의 정보가 실시간으로 바뀌는 구조입니다.
초보인게 자랑은 아니지만… 질문도 아는 만큼 하게되는것같고…ㅠ_ㅠ
아무쪼록… 어떻게 개떡같이 말해도 찰떡같이 알아들어주셔서 어떤 방향으로 가닥을 잡을지…
혹은 아 이건 이래저래서 최선인거같다라던지…
도움을 주실 수 있는 분이 계시다면 감사히 겸허히 받아보겠습니다!!