Bitmap.SetPixel在f#中的作用比在c#中慢 [英] Bitmap.SetPixel acts slower in f# than in c#

查看:144
本文介绍了Bitmap.SetPixel在f#中的作用比在c#中慢的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

f#代码实际上比c#代码慢500倍.我究竟做错了什么? 我试图使两种语言的代码基本相同. SetPixel在f#中的运行速度这么慢没有意义.

The f# code goes literally 500 times slower than the c# code. What am I doing wrong? I tried to make the code basically the same for both languages. It doesn't make sense that SetPixel would be that much slower in f#.

F#:

module Imaging
open System.Drawing;
#light
type Image (width : int, height : int) = class
  member z.Pixels = Array2D.create width height Color.White

  member z.Width with get() = z.Pixels.GetLength 0

  member z.Height with get() = z.Pixels.GetLength 1

  member z.Save (filename:string) =     
    let bitmap = new Bitmap(z.Width, z.Height)
    let xmax = bitmap.Width-1
    let ymax = bitmap.Height-1
    let mutable bob = 0;
    for x in 0..xmax do
      for y in 0..ymax do
        bitmap.SetPixel(x,y,z.Pixels.[x,y])
    bitmap.Save(filename)

  new() = Image(1280, 720)
end
let bob = new Image(500,500)
bob.Save @"C:\Users\White\Desktop\TestImage2.bmp"

C#:

using System.Drawing;

namespace TestProject
{
public class Image
{

    public Color[,] Pixels;
    public int Width
    {
        get
        {
            return Pixels.GetLength(0);
        }
    }
    public int Height
    {
        get
        {
            return Pixels.GetLength(1);
        }
    }

    public Image(int width, int height)
    {
        Pixels = new Color[width, height];
        for (int x = 0; x < Width; x++)
        {
            for (int y = 0; y < Height; y++)
            {
                Pixels[x, y] = Color.White;
            }
        }
    }

    public void Save(string filename)
    {
        Bitmap bitmap = new Bitmap(Width, Height);
        for (int x = 0; x < bitmap.Width; x++)
        {
            for (int y = 0; y < bitmap.Height; y++)
            {
                bitmap.SetPixel(x, y, Pixels[x, y]);
            }
        }
        bitmap.Save(filename);
    }
}
class Program
{
    static void Main(string[] args)
    {
        Image i = new Image(500, 500);
        i.Save(@"C:\Users\White\Desktop\TestImage2.bmp");
    }
}
}

推荐答案

您在F#中对Pixels属性的定义是错误的:每次访问其值时(例如在Save的内部循环中),该定义将重新评估.您应该改用以下形式:

Your definition of the Pixels property in F# is wrong: each time its value is accessed (e.g. in the inner loop of Save), the definition will be reevaluated. You should use this form instead:

member val Pixels = Array2D.create width height Color.White

这将在调用构造函数时对右侧进行一次评估,然后缓存该值.

This will evaluate the right-hand side exactly once, when the constructor is called, and then cache the value.

这篇关于Bitmap.SetPixel在f#中的作用比在c#中慢的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆