WPF中多线程统计拆箱装箱和泛型的运行效率

本文通过WPF应用展示多线程环境下,使用装箱拆箱与泛型的执行效率对比。实验设置两个线程分别进行大量数据处理,一个使用装箱拆箱,另一个使用泛型,结果显示泛型效率至少提高两倍。

WPF中多线程统计拆箱装箱和泛型的执行效率。使用的知识点有泛型、多线程、托付。从样例中能够看到使用泛型的效率至少提升2倍



MainWindow.xaml

<Window x:Class="Box.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <TextBlock FontSize="12" HorizontalAlignment="Left" Margin="30" Text="装箱、开箱:"></TextBlock>
        <TextBlock FontSize="12" Text="0" Margin="30" Name="InformationOne" Grid.Column="1" Grid.Row="0"></TextBlock>
        <TextBlock FontSize="12" HorizontalAlignment="Left" Margin="30" Text="使用泛型:" Grid.Column="0" Grid.Row="1"></TextBlock>
        <TextBlock FontSize="12" Text="0"  Margin="30" Name="InformationTwo" Grid.Column="1" Grid.Row="1"></TextBlock>
        <Button FontSize="20" HorizontalAlignment="Stretch" Margin="10" Name="Button"  Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="3" Content="開始" Click="Button_Click"></Button>

    </Grid>
</Window>

MainWindow.xaml.cs

    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        /// <summary>
        /// 托付对象
        /// </summary>
        /// <param name="completed">完毕次数</param>
        public delegate void CallBackDelegate(int completed);
        public MainWindow()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 回调方法
        /// </summary>
        /// <param name="completed">完毕次数</param>
        private void CallBack(int completed)
        {
            MessageBox.Show(string.Format("子线程通知主线程:执行完毕,线程执行{0}次。", completed));
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Total total = new Total();
            total.informationOne = InformationOne;
            total.informationTwo = InformationTwo;
            InformationOne.Text = "0";
            InformationTwo.Text = "0";
            total.button = Button;
            CallBackDelegate handler = CallBack;
            total.callBack = handler;
            
            for (int i = 0; i < 2; i++)
            {
                Thread thread = new Thread(new ParameterizedThreadStart(total.TotalNumber));
                thread.IsBackground = true;
                thread.Start(i);
            }
            Button.Visibility = System.Windows.Visibility.Hidden;                        
        }
    }

    public class Total
    {
        /// <summary>
        /// 显示拆箱、装箱的TextBlock
        /// </summary>
        public TextBlock informationOne;

        /// <summary>
        /// 显示泛型的TextBlock
        /// </summary>
        public TextBlock informationTwo;

        /// <summary>
        /// 用来控制按钮的显示和隐藏
        /// </summary>
        public Button button;
        /// <summary>
        /// 托付对象
        /// </summary>
        public object callBack;

        /// <summary>
        /// 总的执行次数
        /// </summary>
        private int times = 10000000;

        /// <summary>
        /// 线程的訪问次数
        /// </summary>
        private int completed = 0;

        public void TotalNumber(object obj)
        {
            lock (typeof(Total))
            {
                //把传来的參数转换为托付
                MainWindow.CallBackDelegate handler = callBack as MainWindow.CallBackDelegate;
                if (obj.Equals(0))
                {
                    Stopwatch watch = new Stopwatch();
                    watch.Start();
                    ArrayList array = new ArrayList();
                    for (int i = 0; i < times; i++)
                    {
                        array.Add(i);//装箱
                    }
                    int m = 0;
                    foreach (int i in array)//拆箱
                    {
                        if (i % 1000 == 0 || i >= times)
                        {
                            informationOne.Dispatcher.Invoke(
                                new Action(
                                     delegate
                                     {
                                         informationOne.Text = m.ToString();
                                     }
                                )
                            );
                        }
                        m++;
                    }
                    watch.Stop();
                    //watch.Reset();

                    string infoOne = string.Format("装箱、开箱耗时:{1}毫秒", m, watch.ElapsedMilliseconds);
                    informationOne.Dispatcher.Invoke(
                        new Action(
                             delegate
                             {
                                 informationOne.Text = infoOne;
                             }
                        )
                    );
                }
                else
                {
                    DateTime startTime = DateTime.Now;
                    List<int> list = new List<int>();
                    for (int i = 0; i < times; i++)
                    {
                        list.Add(i);
                    }
                    int n = 0;
                    foreach (int i in list)
                    {
                        if (i % 1000 == 0 || i >= times)
                        {
                            informationTwo.Dispatcher.Invoke(
                                new Action(
                                     delegate
                                     {
                                         informationTwo.Text = n.ToString();
                                     }
                                )
                            );
                        }
                        n++;
                    }
                    TimeSpan timeSpan = DateTime.Now - startTime;
                    string infoTwo = string.Format("使用泛型耗时:{1}毫秒", n, (int)timeSpan.TotalMilliseconds);
                    informationTwo.Dispatcher.Invoke(
                        new Action(
                             delegate
                             {
                                 informationTwo.Text = infoTwo;
                             }
                        )
                    );
                }
                completed++;
                if (completed >= 2)
                {
                    button.Dispatcher.Invoke(
                        new Action(
                             delegate
                             {
                                 button.Visibility = Visibility.Visible;
                             }
                        )
                    );
                    handler(completed);
                }
            }
        }
    }


转载于:https://www.cnblogs.com/zhchoutai/p/8452549.html

上位机面试题 C#-IOC框架 什么是值类引用类他们的本质区别是 抽象类接口的区别 什么是委托他事件有什么区别 IOC依赖注入怎么注入 C#集合简单介绍 简单阐述一下C#GC垃圾回收机制 依赖注入的核心思想 依赖注入的三个生命周期 Netcore 1.可以简单简述一下什么是中间件吗,中间的redis能简单阐述一下吗 2.JWT是个什么机制? 3.讲一下过滤器中间件的区别 4.什么是landam表达式 5.讲述一下C#里的集合,如果频繁进行增删查改操作需要用到什么集合 6.什么是,为什么需要使用 7.多态是什么 8.C#重载是什么 9.接口抽象类的区别 10.值类引用类的本质区别 11.什么是装箱?什么是拆箱? 12.讲一下为什么要推荐面向接口编程 13.设计模式有了解吗 WPF 1.依赖属性的应用,什么是依赖属性 2.WPF里面的命令是什么?有什么作用 3.浅谈一下mvvm模 4.讲述你常用ORM框架 5.WPF的动画如何实现?(动画监听) 6.WPF用户控件如何进行绑定,你有封装过吗? 7. 多线程 讲一下为什么要用多线程多线程的关键字是什么 如何保证多线程同步机制 如果我要采集500台机器,你怎么防止网络堵塞,保证数据的实时采集 通讯协议 1.简述一下串口通讯协议 2.Modbus协议是什么 3.西门子S7通讯协议是怎么样的 4.简单阐述一下TCP三次握手协议 数据库 1.数据库索引 2.索引的数据结构 3.索引采用什么数据结构存储,在不同的数据库引擎中 4.浅谈一下数据库里面视图,存储过程。 UML 讲述一下软件生命周期步骤 分别解答下上述面试问题
最新发布
08-21
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值