Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using Godot;
- using System;
- using System.Collections.Generic;
- using System.Runtime.InteropServices;
- namespace Game;
- public partial class Main : Node2D
- {
- #region timer
- private ulong _time;
- private void TimeStart()
- {
- _time = Time.GetTicksUsec();
- }
- private void TimeStop(string prefix = "")
- {
- string Reverse(string s)
- {
- char[] chars = s.ToCharArray();
- Array.Reverse(chars);
- return new string(chars);
- }
- string Parse(string s, bool isReverse)
- {
- if (isReverse)
- s = Reverse(s);
- var r = new List<string>();
- for (int i = 0; i < s.Length; i++)
- {
- if (i % 3 == 0 && i != 0)
- r.Add("_");
- r.Add(s[i].ToString());
- }
- if (isReverse)
- r.Reverse();
- return string.Join("", r);
- }
- double elapsed = (double)(Time.GetTicksUsec() - _time) / 1_000_000.0;
- string t = elapsed.ToString();
- if (t == "0")
- t += ",0";
- string[] parts = t.Split(',');
- GD.Print(
- Parse(parts[0], true)
- + "."
- + Parse(parts[1].PadRight(6, '0'), false)
- + "\t"
- + prefix
- );
- }
- #endregion
- private int once = 0;
- const int count = 50;
- const int sizeArr = 1_000_000;
- private List<int> list = [];
- private Godot.Collections.Array<int> godotList = [];
- public override void _Ready()
- {
- }
- public override void _Process(double delta)
- {
- once++;
- if (once == 120)
- {
- // Test_Each_List_Global();
- // Test_Each_List();
- // Test_Each_GodoList();
- Test_For_array();
- Test_For_array_new();
- Test_For_list();
- Test_For_list_AsSpan();
- Test_For_list_class();
- Test_For_list_reference();
- Test_For_list_reference_link();
- Test_For_list_reference_new();
- Info();
- ShowGc();
- }
- }
- struct Point
- {
- public int x;
- public int y;
- }
- class PointClass
- {
- public int x;
- public int y;
- }
- private void Test_For_array()
- {
- Point[] list = new Point[sizeArr];
- // не нужно но для чистоты
- for (int i = 0; i < sizeArr; i++)
- {
- list[i].x = i;
- list[i].y = i;
- }
- TimeStart();
- for (int a = 0; a < count; a++)
- {
- for (int i = 0; i < sizeArr; i++)
- {
- list[i].x = i + count;
- list[i].y = i + count;
- }
- }
- TimeStop("FOR array");
- }
- private void Test_For_array_new()
- {
- Point[] list = new Point[sizeArr];
- for (int i = 0; i < sizeArr; i++)
- {
- list[i].x = i;
- list[i].y = i;
- }
- TimeStart();
- for (int a = 0; a < count; a++)
- {
- for (int i = 0; i < sizeArr; i++)
- {
- Point point = list[i];
- point.x = i + count;
- point.y = i + count;
- list[i] = point;
- }
- }
- TimeStop("FOR array new");
- }
- private void Test_For_list()
- {
- List<Point> list = [];
- for (int i = 0; i < sizeArr; i++)
- {
- list.Add(new Point
- {
- x = i,
- y = i
- });
- }
- TimeStart();
- for (int a = 0; a < count; a++)
- {
- for (int i = 0; i < sizeArr; i++)
- {
- Point point = list[i];
- point.x = i + count;
- point.y = i + count;
- list[i] = point;
- }
- }
- TimeStop("FOR list");
- }
- private void Test_For_list_AsSpan()
- {
- List<Point> list = [];
- for (int i = 0; i < sizeArr; i++)
- {
- list.Add(new Point
- {
- x = i,
- y = i
- });
- }
- Span<Point> span = CollectionsMarshal.AsSpan(list);
- TimeStart();
- for (int a = 0; a < count; a++)
- {
- for (int i = 0; i < sizeArr; i++)
- {
- span[i].x = i + count;
- span[i].y = i + count;
- }
- }
- TimeStop("FOR list AsSpan");
- }
- private void Test_For_list_class()
- {
- List<PointClass> list = [];
- for (int i = 0; i < sizeArr; i++)
- {
- list.Add(new PointClass
- {
- x = i,
- y = i
- });
- }
- TimeStart();
- for (int a = 0; a < count; a++)
- {
- for (int i = 0; i < sizeArr; i++)
- {
- list[i].x = i + count;
- list[i].y = i + count;
- }
- }
- TimeStop("FOR list Class Value");
- }
- private class RefClass
- {
- public string x;
- public string y;
- }
- private void Test_For_list_reference()
- {
- List<RefClass> list = [];
- for (int i = 0; i < sizeArr; i++)
- {
- list.Add(new RefClass
- {
- x = i.ToString(),
- y = i.ToString()
- });
- }
- TimeStart();
- for (int a = 0; a < count; a++)
- {
- for (int i = 0; i < sizeArr; i++)
- {
- list[i].x = "xxxx";
- list[i].y = "yyyy";
- }
- }
- TimeStop("FOR list Class Ref literal");
- }
- private void Test_For_list_reference_new()
- {
- List<RefClass> list = [];
- for (int i = 0; i < sizeArr; i++)
- {
- list.Add(new RefClass
- {
- x = i.ToString(),
- y = i.ToString()
- });
- }
- TimeStart();
- for (int a = 0; a < count; a++)
- {
- for (int i = 0; i < sizeArr; i++)
- {
- list[i].x = (i + count).ToString();
- list[i].y = (i + count).ToString();
- }
- }
- TimeStop("FOR list Class Ref new");
- }
- private void Test_For_list_reference_link()
- {
- List<RefClass> list = [];
- var links = new string[sizeArr];
- for (int i = 0; i < sizeArr; i++)
- {
- list.Add(new RefClass
- {
- x = i.ToString(),
- y = i.ToString()
- });
- links[i] = (i + count).ToString();
- }
- TimeStart();
- for (int a = 0; a < count; a++)
- {
- for (int i = 0; i < sizeArr; i++)
- {
- list[i].x = links[i];
- list[i].y = links[i];
- }
- }
- TimeStop("FOR list Class Ref link");
- }
- void ShowGc()
- {
- GD.Print(
- $"{GC.GetTotalPauseDuration()}"
- );
- }
- private void Info()
- {
- GD.Print();
- GD.Print($"Кол-во итераций: {count}");
- GD.Print($"Размер массива: {sizeArr}");
- }
- private void Test_Each_List_Global()
- {
- var globalClass = new SwapRemover();
- globalClass.Setup(sizeArr, count);
- TimeStart();
- globalClass.Test_Each_List();
- TimeStop("Each C# List GLOBAL_CLASS\t");
- }
- private void Test_Each_List()
- {
- List<int> arr = [];
- for (int i = 0; i < sizeArr; i++)
- {
- arr.Add(i);
- }
- int r = 0;
- TimeStart();
- for (int i = 0; i < count; i++)
- {
- for (int a = 0; a < arr.Count; a++)
- {
- r = arr[a];
- }
- }
- TimeStop("Each C# List\t\t\t\t");
- }
- private void Test_Each_GodoList()
- {
- Godot.Collections.Array<int> arr = [];
- // var _arr = godotList.Duplicate();
- int r = 0;
- for (int i = 0; i < sizeArr; i++)
- {
- arr.Add(i);
- }
- TimeStart();
- for (int i = 0; i < count; i++)
- {
- for (int a = 0; a < arr.Count; a++)
- {
- r = arr[a];
- }
- }
- TimeStop("Each C# Godot List\t\t\t");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment